diff --git a/.gitmodules b/.gitmodules
index de894b04fc..a971b630ef 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,4 @@
-[submodule "firmware/ChibiOS-Contrib"]
- path = firmware/ChibiOS-Contrib
- url = https://github.com/ChibiOS/ChibiOS-Contrib.git
+[submodule "firmware/ChibiOS"]
+ path = firmware/ChibiOS
+ url = https://github.com/ChibiOS/ChibiOS.git
+ branch = stable_16.1.x
diff --git a/firmware/ChibiOS b/firmware/ChibiOS
new file mode 160000
index 0000000000..7cac0e4b08
--- /dev/null
+++ b/firmware/ChibiOS
@@ -0,0 +1 @@
+Subproject commit 7cac0e4b0889b9f22fb998e48ac2a5e3f06e0b93
diff --git a/firmware/Makefile.old b/firmware/Makefile.old
new file mode 100644
index 0000000000..e3e2dbc155
--- /dev/null
+++ b/firmware/Makefile.old
@@ -0,0 +1,340 @@
+##############################################################################
+# Build global options
+# NOTE: Can be overridden externally.
+#
+
+PROJECT_DIR = .
+
+# by default EXTRA_PARAMS is empty and we create 'debug' version of the firmware with additional assertions and statistics
+# for 'release' options see 'clean_compile_two_versions.bat' file
+
+
+# Compiler options here.
+ifeq ($(USE_OPT),)
+ #USE_OPT = $(EXTRA_PARAMS) $(RFLAGS) -Os -fomit-frame-pointer -falign-functions=16 -Werror-implicit-function-declaration -Werror -Wno-error=pointer-sign -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=sign-compare -Wno-error=unused-parameter -Wno-error=missing-field-initializers -Werror=type-limits -Wno-error=strict-aliasing -Wno-error=attributes
+ USE_OPT = -Os -ggdb -fomit-frame-pointer -falign-functions=16
+endif
+
+# C specific options here (added to USE_OPT).
+ifeq ($(USE_COPT),)
+ USE_COPT = -fgnu89-inline -std=gnu99
+endif
+
+# C++ specific options here (added to USE_OPT).
+ifeq ($(USE_CPPOPT),)
+ USE_CPPOPT = -std=c++11 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -Werror=write-strings -Werror=type-limits
+endif
+
+# Enable this if you want the linker to remove unused code and data
+ifeq ($(USE_LINK_GC),)
+ USE_LINK_GC = yes
+endif
+
+# Linker extra options here.
+ifeq ($(USE_LDOPT),)
+ USE_LDOPT = -Os -flto=5
+endif
+
+# Enable this if you want link time optimizations (LTO)
+ifeq ($(USE_LTO),)
+ USE_LTO = 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
+
+# If enabled, this option makes the build process faster by not compiling
+# modules not used in the current configuration.
+ifeq ($(USE_SMART_BUILD),)
+ USE_SMART_BUILD = yes
+endif
+
+#
+# Build global options
+##############################################################################
+
+##############################################################################
+# Architecture or project specific options
+#
+
+# Stack size to be allocated to the Cortex-M process stack. This stack is
+# the stack used by the main() thread.
+ifeq ($(USE_PROCESS_STACKSIZE),)
+ USE_PROCESS_STACKSIZE = 0x0600
+endif
+
+# Stack size to the allocated to the Cortex-M main/exceptions stack. This
+# stack is used for processing interrupts and exceptions.
+ifeq ($(USE_EXCEPTIONS_STACKSIZE),)
+ USE_EXCEPTIONS_STACKSIZE = 0x1000
+endif
+
+# Enables the use of FPU on Cortex-M4 (no, softfp, hard).
+ifeq ($(USE_FPU),)
+ USE_FPU = hard
+endif
+
+#
+# Architecture or project specific options
+##############################################################################
+
+##############################################################################
+# Project, sources and paths
+#
+
+# Define project name here
+PROJECT = rusefi
+
+# Imported source files and paths
+CHIBIOS = ChibiOS
+
+#PROJECT_BOARD = OLIMEX_STM32_E407
+ifneq ($(PROJECT_BOARD),OLIMEX_STM32_E407)
+ PROJECT_BOARD = ST_STM32F4_DISCOVERY
+endif
+DDEFS += -D$(PROJECT_BOARD)
+
+# Startup files.
+include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
+# HAL-OSAL files (optional).
+include $(CHIBIOS)/os/hal/hal.mk
+include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk
+include $(CHIBIOS)/os/hal/boards/$(PROJECT_BOARD)/board.mk
+include $(CHIBIOS)/os/hal/osal/rt/osal.mk
+# RTOS files (optional).
+include $(CHIBIOS)/os/rt/rt.mk
+include $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
+
+include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk
+include console/binary/tunerstudio.mk
+include ext/ext.mk
+include $(PROJECT_DIR)/hw_layer/hw_layer.mk
+include $(PROJECT_DIR)/hw_layer/sensors/sensors.mk
+include $(PROJECT_DIR)/hw_layer/mass_storage/mass_storage.mk
+include development/development.mk
+include controllers/controllers.mk
+
+include $(PROJECT_DIR)/util/util.mk
+include $(PROJECT_DIR)/config/engines/engines.mk
+include $(PROJECT_DIR)/controllers/algo/algo.mk
+include $(PROJECT_DIR)/controllers/core/core.mk
+include $(PROJECT_DIR)/controllers/math/math.mk
+include $(PROJECT_DIR)/controllers/sensors/sensors.mk
+include $(PROJECT_DIR)/controllers/system/system.mk
+include $(PROJECT_DIR)/controllers/trigger/trigger.mk
+include $(PROJECT_DIR)/console/console.mk
+
+
+# Define linker script file here
+LDSCRIPT= config/stm32f4ems/STM32F407xG_CCM.ld
+
+# C sources that can be compiled in ARM or THUMB mode depending on the global
+# setting.
+CSRC = $(STARTUPSRC) \
+ $(KERNSRC) \
+ $(PORTSRC) \
+ $(OSALSRC) \
+ $(HALSRC) \
+ $(PLATFORMSRC) \
+ $(BOARDSRC) \
+ $(CHIBIOS)/os/various/syscalls.c \
+ $(CHIBIOS)/os/hal/lib/streams/memstreams.c \
+ $(CHIBIOS)/os/hal/lib/streams/chprintf.c \
+ $(CHIBIOS)/os/various/shell.c \
+ ${HW_MASS_STORAGE_SRC_C} \
+ $(UTILSRC) \
+ $(ENGINES_SRC) \
+ $(CONSOLESRC) \
+ $(DEV_SRC) \
+ $(HW_LAYER_EMS) \
+ $(CONTROLLERSSRC) \
+ $(CONTROLLERS_ALGO_SRC) \
+ $(CONTROLLERS_CORE_SRC) \
+ $(CONTROLLERS_SENSORS_SRC) \
+ $(FATFSSRC) \
+ $(SYSTEMSRC)
+
+# C++ sources that can be compiled in ARM or THUMB mode depending on the global
+# setting.
+CPPSRC = $(CHCPPSRC) \
+ $(TRIGGER_SRC_CPP) \
+ $(TRIGGER_DECODERS_SRC_CPP) \
+ $(DEV_SRC_CPP) \
+ $(CONTROLLERS_ALGO_SRC_CPP) \
+ $(SYSTEMSRC_CPP) \
+ $(ENGINES_SRC_CPP) \
+ $(HW_LAYER_EMS_CPP) \
+ $(HW_SENSORS_SRC) \
+ $(TUNERSTUDIO_SRC_CPP) \
+ $(CONSOLE_SRC_CPP) \
+ $(CONTROLLERS_SENSORS_SRC_CPP) \
+ $(CONTROLLERS_SRC_CPP) \
+ $(UTILSRC_CPP) \
+ $(CONTROLLERS_CORE_SRC_CPP) \
+ $(CONTROLLERS_MATH_SRC_CPP) \
+ rusefi.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 = $(STARTUPASM) $(PORTASM) $(OSALASM)
+
+INCDIR = $(PORTINC) \
+ $(OSALINC) \
+ $(KERNINC) \
+ $(TESTINC) \
+ $(STARTUPINC) \
+ $(HALINC) \
+ $(PLATFORMINC) \
+ $(BOARDINC) \
+ $(CHCPPINC) \
+ $(CHIBIOS)/os/hal/lib/streams \
+ $(CHIBIOS)/os/various \
+ $(CHIBIOS)/os/various/devices_lib/accel \
+ config/stm32f4ems \
+ config/engines \
+ config \
+ chibios/os/various \
+ ext \
+ ext_algo \
+ util \
+ console_util \
+ console \
+ $(PROJECT_DIR)/console/binary \
+ $(PROJECT_DIR)/console/fl_binary \
+ $(PROJECT_DIR)/hw_layer \
+ $(PROJECT_DIR)/mass_storage \
+ hw_layer/serial_over_usb \
+ hw_layer/algo \
+ hw_layer/lcd \
+ hw_layer/sensors \
+ hw_layer/mass_storage \
+ hw_layer/stm32f4 \
+ development \
+ development/hw_layer \
+ development/test \
+ controllers \
+ controllers/sensors \
+ controllers/system \
+ controllers/algo \
+ controllers/core \
+ controllers/math \
+ controllers/trigger/decoders \
+ controllers/trigger
+
+#
+# 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
+SZ = $(TRGT)size
+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 = -lm
+
+#
+# End of user defines
+##############################################################################
+
+RULESPATH = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC
+include $(RULESPATH)/rules.mk
diff --git a/firmware/config/stm32f4ems/STM32F407xG_CCM.ld b/firmware/config/stm32f4ems/STM32F407xG_CCM.ld
index 1dbaf479a9..d1a5fc1ffa 100644
--- a/firmware/config/stm32f4ems/STM32F407xG_CCM.ld
+++ b/firmware/config/stm32f4ems/STM32F407xG_CCM.ld
@@ -1,186 +1,51 @@
/*
- ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
- 2011,2012,2013 Giovanni Di Sirio.
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
- This file is part of ChibiOS/RT.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
- ChibiOS/RT is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+ http://www.apache.org/licenses/LICENSE-2.0
- ChibiOS/RT is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
- ---
-
- 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.
+ 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.
*/
/*
- * ST32F407xG memory setup.
+ * STM32F407xG memory setup.
+ * Note: Use of ram1 and ram2 is mutually exclusive with use of ram0.
*/
-__main_stack_size__ = 0x1000;
-__process_stack_size__ = 0x0600;
-
MEMORY
{
flash : org = 0x08000000, len = 896k
- ram : org = 0x20000000, len = 112k
- ethram : org = 0x2001C000, len = 16k
- ccmram : org = 0x10000000, len = 64k
+ ram0 : org = 0x20000000, len = 128k /* SRAM1 + SRAM2 */
+ ram1 : org = 0x20000000, len = 112k /* SRAM1 */
+ ram2 : org = 0x2001C000, len = 16k /* SRAM2 */
+ ram3 : org = 0x00000000, len = 0
+ ram4 : org = 0x10000000, len = 64k /* CCM SRAM */
+ ram5 : org = 0x40024000, len = 4k /* BCKP SRAM */
+ ram6 : org = 0x00000000, len = 0
+ ram7 : org = 0x00000000, len = 0
}
-__ram_start__ = ORIGIN(ram);
-__ram_size__ = LENGTH(ram);
-__ram_end__ = __ram_start__ + __ram_size__;
+/* RAM region to be used for Main stack. This stack accommodates the processing
+ of all exceptions and interrupts*/
+REGION_ALIAS("MAIN_STACK_RAM", ram0);
-ENTRY(ResetHandler)
+/* RAM region to be used for the process stack. This is the stack used by
+ the main() function.*/
+REGION_ALIAS("PROCESS_STACK_RAM", ram0);
-SECTIONS
-{
- . = 0;
- _text = .;
+/* RAM region to be used for data segment.*/
+REGION_ALIAS("DATA_RAM", ram0);
- startup : ALIGN(16) SUBALIGN(16)
- {
- KEEP(*(vectors))
- } > flash
+/* RAM region to be used for BSS segment.*/
+REGION_ALIAS("BSS_RAM", ram0);
- constructors : ALIGN(4) SUBALIGN(4)
- {
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
- } > flash
+/* RAM region to be used for the default heap.*/
+REGION_ALIAS("HEAP_RAM", ram0);
- 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
-
- .ccm (NOLOAD) :
- {
- 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);
- *(.ccm)
- . = ALIGN(4);
- *(.ccm.*)
- . = ALIGN(4);
- PROVIDE(_cmm_end = .);
- } > 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__;
+INCLUDE rules.ld
diff --git a/firmware/config/stm32f4ems/chconf.h b/firmware/config/stm32f4ems/chconf.h
index f9c1374828..9422affdf4 100644
--- a/firmware/config/stm32f4ems/chconf.h
+++ b/firmware/config/stm32f4ems/chconf.h
@@ -1,28 +1,17 @@
/*
- ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
- 2011,2012 Giovanni Di Sirio.
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
- This file is part of ChibiOS/RT.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
- ChibiOS/RT is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+ http://www.apache.org/licenses/LICENSE-2.0
- ChibiOS/RT is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
- ---
-
- 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.
+ 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.
*/
/**
@@ -39,46 +28,37 @@
#ifndef _CHCONF_H_
#define _CHCONF_H_
-#define chDbgCheck(c, func) { \
- if (!(c)) \
- chDbgPanic3(__QUOTE_THIS(func)"()", __FILE__, __LINE__); \
-}
-
-#define CORTEX_PRIORITY_SYSTICK 6
-
-#define PORT_IDLE_THREAD_STACK_SIZE 1024
-
-#define CHPRINTF_USE_FLOAT TRUE
-
-#define EFI_CLOCK_LOCKS FALSE
-
-
-#if EFI_CLOCK_LOCKS
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* __cplusplus */
- void onLockHook(void);
- void onUnlockHook(void);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
- #define ON_LOCK_HOOK onLockHook()
- #define ON_UNLOCK_HOOK onUnlockHook()
-#else /* EFI_CLOCK_LOCKS */
- #define ON_LOCK_HOOK
- #define ON_UNLOCK_HOOK
-#endif /* EFI_CLOCK_LOCKS */
-
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
/**
- * number of ticks per second
- *
- * 8000 rpm equals 133Hz of crankshaft
- * that's 266Hz camshaft
- * for timing measures we need 95760 Hz precision
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
*/
-#define CH_FREQUENCY 1000
+#define CH_CFG_ST_RESOLUTION 32
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#define CH_CFG_ST_FREQUENCY 1000
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#define CH_CFG_ST_TIMEDELTA 0
+
+/** @} */
/*===========================================================================*/
/**
@@ -87,15 +67,6 @@ extern "C"
*/
/*===========================================================================*/
-/**
- * @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
@@ -103,13 +74,12 @@ extern "C"
* 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.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
*/
-#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__)
-#define CH_TIME_QUANTUM 20
-#endif
+#define CH_CFG_TIME_QUANTUM 0
/**
* @brief Managed RAM size.
@@ -120,29 +90,18 @@ extern "C"
*
* @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.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
*/
-#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__)
-// memory pool is used by ff.c which is used for file logging
-#define CH_MEMCORE_SIZE 2048
-#endif
+#define CH_CFG_MEMCORE_SIZE 0
/**
* @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.
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
*/
-#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__)
-#define CH_NO_IDLE_THREAD FALSE
-#endif
+#define CH_CFG_NO_IDLE_THREAD FALSE
/** @} */
@@ -161,9 +120,7 @@ extern "C"
* @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
+#define CH_CFG_OPTIMIZE_SPEED TRUE
/** @} */
@@ -174,15 +131,22 @@ extern "C"
*/
/*===========================================================================*/
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_TM TRUE
+
/**
* @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
+#define CH_CFG_USE_REGISTRY TRUE
/**
* @brief Threads synchronization APIs.
@@ -191,9 +155,7 @@ extern "C"
*
* @note The default is @p TRUE.
*/
-#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__)
-#define CH_USE_WAITEXIT FALSE
-#endif
+#define CH_CFG_USE_WAITEXIT TRUE
/**
* @brief Semaphores APIs.
@@ -201,33 +163,18 @@ extern "C"
*
* @note The default is @p TRUE.
*/
-#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__)
-#define CH_USE_SEMAPHORES TRUE
-#endif
+#define CH_CFG_USE_SEMAPHORES TRUE
/**
* @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.
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_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
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
/**
* @brief Mutexes APIs.
@@ -235,9 +182,17 @@ extern "C"
*
* @note The default is @p TRUE.
*/
-#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__)
-#define CH_USE_MUTEXES TRUE
-#endif
+#define CH_CFG_USE_MUTEXES TRUE
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
/**
* @brief Conditional Variables APIs.
@@ -245,11 +200,9 @@ extern "C"
* in the kernel.
*
* @note The default is @p TRUE.
- * @note Requires @p CH_USE_MUTEXES.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
*/
-#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__)
-#define CH_USE_CONDVARS FALSE
-#endif
+#define CH_CFG_USE_CONDVARS TRUE
/**
* @brief Conditional Variables APIs with timeout.
@@ -257,11 +210,9 @@ extern "C"
* specification are included in the kernel.
*
* @note The default is @p TRUE.
- * @note Requires @p CH_USE_CONDVARS.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
*/
-#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__)
-#define CH_USE_CONDVARS_TIMEOUT FALSE
-#endif
+#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE
/**
* @brief Events Flags APIs.
@@ -269,9 +220,7 @@ extern "C"
*
* @note The default is @p TRUE.
*/
-#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__)
-#define CH_USE_EVENTS TRUE
-#endif
+#define CH_CFG_USE_EVENTS TRUE
/**
* @brief Events Flags APIs with timeout.
@@ -279,11 +228,9 @@ extern "C"
* are included in the kernel.
*
* @note The default is @p TRUE.
- * @note Requires @p CH_USE_EVENTS.
+ * @note Requires @p CH_CFG_USE_EVENTS.
*/
-#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__)
-#define CH_USE_EVENTS_TIMEOUT TRUE
-#endif
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
/**
* @brief Synchronous Messages APIs.
@@ -292,21 +239,18 @@ extern "C"
*
* @note The default is @p TRUE.
*/
-#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__)
-#define CH_USE_MESSAGES TRUE
-#endif
+#define CH_CFG_USE_MESSAGES TRUE
/**
* @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.
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
*/
-#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__)
-#define CH_USE_MESSAGES_PRIORITY FALSE
-#endif
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
/**
* @brief Mailboxes APIs.
@@ -314,11 +258,9 @@ extern "C"
* included in the kernel.
*
* @note The default is @p TRUE.
- * @note Requires @p CH_USE_SEMAPHORES.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
*/
-#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__)
-#define CH_USE_MAILBOXES TRUE
-#endif
+#define CH_CFG_USE_MAILBOXES TRUE
/**
* @brief I/O Queues APIs.
@@ -326,9 +268,7 @@ extern "C"
*
* @note The default is @p TRUE.
*/
-#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__)
-#define CH_USE_QUEUES TRUE
-#endif
+#define CH_CFG_USE_QUEUES TRUE
/**
* @brief Core Memory Manager APIs.
@@ -337,9 +277,7 @@ extern "C"
*
* @note The default is @p TRUE.
*/
-#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__)
-#define CH_USE_MEMCORE TRUE
-#endif
+#define CH_CFG_USE_MEMCORE TRUE
/**
* @brief Heap Allocator APIs.
@@ -347,27 +285,11 @@ extern "C"
* 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 Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_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
+#define CH_CFG_USE_HEAP TRUE
/**
* @brief Memory Pools Allocator APIs.
@@ -376,9 +298,7 @@ extern "C"
*
* @note The default is @p TRUE.
*/
-#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__)
-#define CH_USE_MEMPOOLS TRUE
-#endif
+#define CH_CFG_USE_MEMPOOLS TRUE
/**
* @brief Dynamic Threads APIs.
@@ -386,12 +306,10 @@ extern "C"
* 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.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
*/
-#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__)
-#define CH_USE_DYNAMIC FALSE
-#endif
+#define CH_CFG_USE_DYNAMIC TRUE
/** @} */
@@ -402,6 +320,13 @@ extern "C"
*/
/*===========================================================================*/
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#define CH_DBG_STATISTICS TRUE
+
/**
* @brief Debug option, system state check.
* @details If enabled the correct call protocol for system APIs is checked
@@ -409,9 +334,7 @@ extern "C"
*
* @note The default is @p FALSE.
*/
-#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__)
-#define CH_DBG_SYSTEM_STATE_CHECK TRUE
-#endif
+#define CH_DBG_SYSTEM_STATE_CHECK TRUE
/**
* @brief Debug option, parameters checks.
@@ -420,9 +343,7 @@ extern "C"
*
* @note The default is @p FALSE.
*/
-#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__)
-#define CH_DBG_ENABLE_CHECKS TRUE
-#endif
+#define CH_DBG_ENABLE_CHECKS TRUE
/**
* @brief Debug option, consistency checks.
@@ -432,9 +353,7 @@ extern "C"
*
* @note The default is @p FALSE.
*/
-#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__)
-#define CH_DBG_ENABLE_ASSERTS TRUE
-#endif
+#define CH_DBG_ENABLE_ASSERTS TRUE
/**
* @brief Debug option, trace buffer.
@@ -443,9 +362,7 @@ extern "C"
*
* @note The default is @p FALSE.
*/
-#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__)
-#define CH_DBG_ENABLE_TRACE TRUE
-#endif
+#define CH_DBG_ENABLE_TRACE TRUE
/**
* @brief Debug option, stack checks.
@@ -457,9 +374,7 @@ extern "C"
* @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
+#define CH_DBG_ENABLE_STACK_CHECK TRUE
/**
* @brief Debug option, stacks initialization.
@@ -469,22 +384,18 @@ extern "C"
*
* @note The default is @p FALSE.
*/
-#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__)
-#define CH_DBG_FILL_THREADS TRUE
-#endif
+#define CH_DBG_FILL_THREADS TRUE
/**
* @brief Debug option, threads profiling.
- * @details If enabled then a field is added to the @p Thread structure that
+ * @details If enabled then a field is added to the @p thread_t 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.
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
*/
-#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__)
-#define CH_DBG_THREADS_PROFILING TRUE
-#endif
+#define CH_DBG_THREADS_PROFILING FALSE
/** @} */
@@ -497,14 +408,12 @@ extern "C"
/**
* @brief Threads descriptor structure extension.
- * @details User fields added to the end of the @p Thread structure.
+ * @details User fields added to the end of the @p thread_t structure.
*/
-#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__)
-#define THREAD_EXT_FIELDS \
- void *activeStack; \
- int remainingStack; \
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ void *activeStack; \
+ int remainingStack; \
/* Add threads custom fields here.*/
-#endif
/**
* @brief Threads initialization hook.
@@ -513,11 +422,9 @@ extern "C"
* @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) { \
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
/* Add threads initialization code here.*/ \
}
-#endif
/**
* @brief Threads finalization hook.
@@ -527,61 +434,61 @@ extern "C"
* @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) { \
+#define CH_CFG_THREAD_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.*/ \
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
}
-#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() { \
+#define CH_CFG_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() { \
+#define CH_CFG_SYSTEM_TICK_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__)
-#if CH_DBG_ENABLED
-
-#define SYSTEM_HALT_HOOK() { \
- print("FATAL %s\r\n", dbg_panic_msg); \
- chThdSleepMilliseconds(100); \
-/* System halt code here.*/ \
-
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
}
-#endif
-
-#endif
-
/** @} */
@@ -589,7 +496,11 @@ extern "C"
/* Port-specific settings (override port settings defaulted in chcore.h). */
/*===========================================================================*/
-#define CORTEX_USE_FPU TRUE
+#if !CH_DBG_SYSTEM_STATE_CHECK
+extern cnt_t dbg_lock_cnt;
+#define dbg_enter_lock() {dbg_lock_cnt = 1;ON_LOCK_HOOK;}
+#define dbg_leave_lock() {ON_UNLOCK_HOOK;dbg_lock_cnt = 0;}
+#endif
#endif /* _CHCONF_H_ */
diff --git a/firmware/config/stm32f4ems/halconf.h b/firmware/config/stm32f4ems/halconf.h
index 97e7abd8a8..219171e449 100644
--- a/firmware/config/stm32f4ems/halconf.h
+++ b/firmware/config/stm32f4ems/halconf.h
@@ -1,28 +1,17 @@
/*
- ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
- 2011,2012 Giovanni Di Sirio.
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
- This file is part of ChibiOS/RT.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
- ChibiOS/RT is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
+ http://www.apache.org/licenses/LICENSE-2.0
- ChibiOS/RT is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
- ---
-
- 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.
+ 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.
*/
/**
@@ -41,13 +30,6 @@
#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.
*/
@@ -69,6 +51,13 @@
#define HAL_USE_CAN TRUE
#endif
+/**
+ * @brief Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
/**
* @brief Enables the EXT subsystem.
*/
@@ -90,6 +79,13 @@
#define HAL_USE_I2C TRUE
#endif
+/**
+ * @brief Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S FALSE
+#endif
+
/**
* @brief Enables the ICU subsystem.
*/
@@ -167,6 +163,13 @@
#define HAL_USE_USB TRUE
#endif
+/**
+ * @brief Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG FALSE
+#endif
+
/*===========================================================================*/
/* ADC driver related settings. */
/*===========================================================================*/
@@ -213,6 +216,13 @@
/* MAC driver related settings. */
/*===========================================================================*/
+/**
+ * @brief Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY FALSE
+#endif
+
/**
* @brief Enables an event sources for incoming packets.
*/
@@ -224,13 +234,6 @@
/* 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
@@ -243,32 +246,6 @@
#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. */
/*===========================================================================*/
@@ -317,13 +294,36 @@
* @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
+ * @note The default is 16 bytes for both the transmission and receive
* buffers.
*/
#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define SERIAL_BUFFERS_SIZE 16
#endif
+/*===========================================================================*/
+/* SERIAL_USB driver related setting. */
+/*===========================================================================*/
+
+/**
+ * @brief Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ * the USB data endpoint maximum packet size.
+ * @note The default is 256 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 256
+#endif
+
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
/*===========================================================================*/
/* SPI driver related settings. */
/*===========================================================================*/
@@ -344,6 +344,38 @@
#define SPI_USE_MUTUAL_EXCLUSION TRUE
#endif
+/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT FALSE
+#endif
+
#endif /* _HALCONF_H_ */
/** @} */
diff --git a/firmware/config/stm32f4ems/mcuconf.h b/firmware/config/stm32f4ems/mcuconf.h
index 5202f4266b..f62e82893a 100644
--- a/firmware/config/stm32f4ems/mcuconf.h
+++ b/firmware/config/stm32f4ems/mcuconf.h
@@ -1,5 +1,5 @@
/*
- ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,6 +14,16 @@
limitations under the License.
*/
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+#include "efifeatures.h"
+#include "rusefi_enums.h"
+
+#define SCHEDULING_TIMER_PRIORITY 4
+
+#define ICU_PRIORITY 3
+
/*
* STM32F4xx drivers configuration.
* The following settings override the default settings present in
@@ -30,13 +40,6 @@
#define STM32F4xx_MCUCONF
-#include "efifeatures.h"
-#include "rusefi_enums.h"
-
-#define SCHEDULING_TIMER_PRIORITY 4
-
-#define ICU_PRIORITY 3
-
/*
* HAL driver system settings.
*/
@@ -44,29 +47,18 @@
#define STM32_HSI_ENABLED TRUE
#define STM32_LSI_ENABLED TRUE
#define STM32_HSE_ENABLED TRUE
-
-// change this 'FALSE to TRUE if you have the LSE 32768 quarts
-#define STM32_LSE_ENABLED TRUE
-
+#define STM32_LSE_ENABLED FALSE
#define STM32_CLOCK48_REQUIRED TRUE
#define STM32_SW STM32_SW_PLL
#define STM32_PLLSRC STM32_PLLSRC_HSE
-#ifdef OLIMEX_STM32_E407
-#define STM32_PLLM_VALUE 12
-#else
#define STM32_PLLM_VALUE 8
-#endif
#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
-#if STM32_LSE_ENABLED
- #define STM32_RTCSEL STM32_RTCSEL_LSE
-#else
- #define STM32_RTCSEL STM32_RTCSEL_LSI
-#endif
+#define STM32_RTCSEL STM32_RTCSEL_LSI
#define STM32_RTCPRE_VALUE 8
#define STM32_MCO1SEL STM32_MCO1SEL_HSI
#define STM32_MCO1PRE STM32_MCO1PRE_DIV1
@@ -75,16 +67,16 @@
#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
+#define STM32_BKPRAM_ENABLE FALSE
/*
* ADC driver system settings.
*/
#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4
-#define STM32_ADC_USE_ADC1 TRUE // slow ADC
-#define STM32_ADC_USE_ADC2 TRUE // fast ADC
+#define STM32_ADC_USE_ADC1 TRUE
+#define STM32_ADC_USE_ADC2 TRUE
#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)
@@ -105,6 +97,19 @@
#define STM32_CAN_CAN1_IRQ_PRIORITY 11
#define STM32_CAN_CAN2_IRQ_PRIORITY 11
+/*
+ * DAC driver system settings.
+ */
+#define STM32_DAC_DUAL_MODE FALSE
+#define STM32_DAC_USE_DAC1_CH1 FALSE
+#define STM32_DAC_USE_DAC1_CH2 FALSE
+#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10
+#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10
+#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2
+#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2
+#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+
/*
* EXT driver system settings.
*/
@@ -142,7 +147,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 SCHEDULING_TIMER_PRIORITY
+#define STM32_GPT_TIM5_IRQ_PRIORITY 7
#define STM32_GPT_TIM6_IRQ_PRIORITY 7
#define STM32_GPT_TIM7_IRQ_PRIORITY 7
#define STM32_GPT_TIM8_IRQ_PRIORITY 7
@@ -157,7 +162,8 @@
#define STM32_I2C_USE_I2C1 TRUE
#define STM32_I2C_USE_I2C2 FALSE
#define STM32_I2C_USE_I2C3 FALSE
-#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_I2C_BUSY_TIMEOUT 50
+#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)
@@ -169,28 +175,40 @@
#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()
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * I2S driver system settings.
+ */
+#define STM32_I2S_USE_SPI2 FALSE
+#define STM32_I2S_USE_SPI3 FALSE
+#define STM32_I2S_SPI2_IRQ_PRIORITY 10
+#define STM32_I2S_SPI3_IRQ_PRIORITY 10
+#define STM32_I2S_SPI2_DMA_PRIORITY 1
+#define STM32_I2S_SPI3_DMA_PRIORITY 1
+#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3)
+#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
+#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2S_DMA_ERROR_HOOK(i2sp) osalSysHalt("DMA failure")
/*
* ICU driver system settings.
*/
-#define STM32_ICU_USE_TIM1 TRUE // wave input
-#define STM32_ICU_USE_TIM2 TRUE // primary position sensor
-#define STM32_ICU_USE_TIM3 TRUE // secondary position sensor
+#define STM32_ICU_USE_TIM1 TRUE
+#define STM32_ICU_USE_TIM2 TRUE
+#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_USE_TIM9 TRUE // wave input
-
-#define STM32_ICU_TIM1_IRQ_PRIORITY ICU_PRIORITY
-#define STM32_ICU_TIM2_IRQ_PRIORITY ICU_PRIORITY
-#define STM32_ICU_TIM3_IRQ_PRIORITY ICU_PRIORITY
-#define STM32_ICU_TIM4_IRQ_PRIORITY ICU_PRIORITY
-#define STM32_ICU_TIM5_IRQ_PRIORITY ICU_PRIORITY
-#define STM32_ICU_TIM8_IRQ_PRIORITY ICU_PRIORITY
-#define STM32_ICU_TIM9_IRQ_PRIORITY ICU_PRIORITY
+#define STM32_ICU_USE_TIM9 TRUE
+#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
+#define STM32_ICU_TIM9_IRQ_PRIORITY 7
/*
* MAC driver system settings.
@@ -203,18 +221,17 @@
#define STM32_MAC_ETH1_IRQ_PRIORITY 13
#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0
-#define STM32_PWM_USE_TIM1 FALSE
-#define STM32_PWM_USE_TIM2 FALSE
-#define STM32_PWM_USE_TIM3 FALSE
-#define STM32_PWM_USE_TIM4 TRUE // fast adc
-#define STM32_PWM_USE_TIM5 FALSE
-#define STM32_PWM_USE_TIM8 TRUE // slow adc
-#define STM32_PWM_USE_TIM9 FALSE
-
/*
* 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 TRUE
+#define STM32_PWM_USE_TIM9 FALSE
#define STM32_PWM_TIM1_IRQ_PRIORITY 7
#define STM32_PWM_TIM2_IRQ_PRIORITY 7
#define STM32_PWM_TIM3_IRQ_PRIORITY 7
@@ -223,6 +240,17 @@
#define STM32_PWM_TIM8_IRQ_PRIORITY 7
#define STM32_PWM_TIM9_IRQ_PRIORITY 7
+/*
+ * SDC driver system settings.
+ */
+#define STM32_SDC_SDIO_DMA_PRIORITY 3
+#define STM32_SDC_SDIO_IRQ_PRIORITY 9
+#define STM32_SDC_WRITE_TIMEOUT_MS 250
+#define STM32_SDC_READ_TIMEOUT_MS 25
+#define STM32_SDC_CLOCK_ACTIVATION_DELAY 10
+#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE
+#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3)
+
/*
* SERIAL driver system settings.
*/
@@ -243,8 +271,8 @@
* SPI driver system settings.
*/
#define STM32_SPI_USE_SPI1 TRUE
-#define STM32_SPI_USE_SPI2 TRUE // external ADC
-#define STM32_SPI_USE_SPI3 TRUE // potentiometer
+#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)
@@ -257,7 +285,13 @@
#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) chDbgCheck(TRUE, "STM32_SPI_DMA_ERROR_HOOK")
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 8
+#define STM32_ST_USE_TIMER 2
/*
* UART driver system settings.
@@ -265,6 +299,8 @@
#define STM32_UART_USE_USART1 FALSE
#define STM32_UART_USE_USART2 FALSE
#define STM32_UART_USE_USART3 TRUE
+#define STM32_UART_USE_UART4 FALSE
+#define STM32_UART_USE_UART5 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)
@@ -272,17 +308,25 @@
#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_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2)
+#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
+#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
#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_UART4_IRQ_PRIORITY 12
+#define STM32_UART_UART5_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_UART4_DMA_PRIORITY 0
+#define STM32_UART_UART5_DMA_PRIORITY 0
#define STM32_UART_USART6_DMA_PRIORITY 0
-#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt()
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
/*
* USB driver system settings.
@@ -294,5 +338,12 @@
#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 1024
+#define STM32_USB_OTG_THREAD_STACK_SIZE 128
#define STM32_USB_OTGFIFO_FILL_BASEPRI 0
+
+/*
+ * WDG driver system settings.
+ */
+#define STM32_WDG_USE_IWDG FALSE
+
+#endif /* _MCUCONF_H_ */
diff --git a/firmware/console/binary/tunerstudio_io.cpp b/firmware/console/binary/tunerstudio_io.cpp
index 29b0aff381..380305f87a 100644
--- a/firmware/console/binary/tunerstudio_io.cpp
+++ b/firmware/console/binary/tunerstudio_io.cpp
@@ -68,7 +68,7 @@ BaseChannel * getTsSerialDevice(void) {
}
void tunerStudioWriteData(ts_channel_s *tsChannel, const uint8_t * buffer, int size) {
- efiAssertVoid(getRemainingStack(chThdSelf()) > 64, "tunerStudioWriteData");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 64, "tunerStudioWriteData");
#if EFI_SIMULATOR || defined(__DOXYGEN__)
logMsg("chSequentialStreamWrite [%d]\r\n", size);
#endif
diff --git a/firmware/console/eficonsole.cpp b/firmware/console/eficonsole.cpp
index 2cfcf79029..a7bf1a4c0b 100644
--- a/firmware/console/eficonsole.cpp
+++ b/firmware/console/eficonsole.cpp
@@ -32,7 +32,7 @@
static LoggingWithStorage logger("console");
static void myfatal(void) {
- chDbgCheck(0, "my fatal");
+ chDbgCheck(0);
}
static void myerror(void) {
diff --git a/firmware/controllers/algo/error_handling.h b/firmware/controllers/algo/error_handling.h
index 3f566b2c64..001c3c8f70 100644
--- a/firmware/controllers/algo/error_handling.h
+++ b/firmware/controllers/algo/error_handling.h
@@ -45,7 +45,7 @@ char *getFirmwareError(void);
* so that it would not crash the error handler in case of stack issues
*/
#if CH_DBG_SYSTEM_STATE_CHECK
-#define hasFatalError() (dbg_panic_msg != NULL)
+#define hasFatalError() (ch.dbg.panic_msg != NULL)
#else
#define hasFatalError() (FALSE)
#endif
diff --git a/firmware/controllers/algo/obd_error_codes.h b/firmware/controllers/algo/obd_error_codes.h
index 7b42fd465c..ac9cc8ecf7 100644
--- a/firmware/controllers/algo/obd_error_codes.h
+++ b/firmware/controllers/algo/obd_error_codes.h
@@ -1698,8 +1698,8 @@ typedef enum {
CUSTOM_OBD_INJECTION_NO_PIN_ASSIGNED = 6020,
CUSTOM_OBD_UNEXPECTED_INJECTION_MODE = 6021,
CUSTOM_OBD_ANGLE_CONSTRAINT_VIOLATION = 6022,
- CUSTOM_OBD_UNKNOWN_FIRING_ORDER = 6023,
- CUSTOM_OBD_WRONG_FIRING_ORDER = 6024,
+ CUSTOM_OBD_23 = 6023,
+ CUSTOM_OBD_24 = 6024,
CUSTOM_OBD_25 = 6025,
CUSTOM_OBD_26 = 6026,
CUSTOM_UNEXPECTED_ENGINE_TYPE = 6027,
diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp
index a548b135a3..480b9d9ca6 100644
--- a/firmware/controllers/engine_controller.cpp
+++ b/firmware/controllers/engine_controller.cpp
@@ -149,13 +149,13 @@ efitick_t getTimeNowNt(void) {
/**
* number of SysClock ticks in one ms
*/
-#define TICKS_IN_MS (CH_FREQUENCY / 1000)
+#define TICKS_IN_MS (CH_CFG_ST_FREQUENCY / 1000)
// todo: this overflows pretty fast!
efitimems_t currentTimeMillis(void) {
// todo: migrate to getTimeNowUs? or not?
- return chTimeNow() / TICKS_IN_MS;
+ return chVTGetSystemTimeX() / TICKS_IN_MS;
}
// todo: this overflows pretty fast!
@@ -205,13 +205,13 @@ static void resetAccel(void) {
}
static void periodicSlowCallback(Engine *engine) {
- efiAssertVoid(getRemainingStack(chThdSelf()) > 64, "lowStckOnEv");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 64, "lowStckOnEv");
#if EFI_PROD_CODE
/**
* We need to push current value into the 64 bit counter often enough so that we do not miss an overflow
*/
bool alreadyLocked = lockAnyContext();
- updateAndSet(&halTime.state, hal_lld_get_counter_value());
+ updateAndSet(&halTime.state, port_rt_get_counter_value());
if (!alreadyLocked) {
unlockAnyContext();
}
diff --git a/firmware/controllers/error_handling.cpp b/firmware/controllers/error_handling.cpp
index e2f32ff744..b58ed065a6 100644
--- a/firmware/controllers/error_handling.cpp
+++ b/firmware/controllers/error_handling.cpp
@@ -54,7 +54,7 @@ void chDbgPanic3(const char *msg, const char * file, int line) {
dbg_panic_file = file;
dbg_panic_line = line;
#if CH_DBG_SYSTEM_STATE_CHECK || defined(__DOXYGEN__)
- dbg_panic_msg = msg;
+ ch.dbg.panic_msg = msg;
#endif /* CH_DBG_SYSTEM_STATE_CHECK */
#if EFI_PROD_CODE || defined(__DOXYGEN__)
@@ -71,7 +71,7 @@ void chDbgPanic3(const char *msg, const char * file, int line) {
if (!main_loop_started) {
print("fatal %s %s:%d\r\n", msg, file, line);
chThdSleepSeconds(1);
- chSysHalt();
+ chSysHalt("Main loop did not start");
}
}
diff --git a/firmware/controllers/lcd_controller.cpp b/firmware/controllers/lcd_controller.cpp
index 7007d2f367..d786ef1395 100644
--- a/firmware/controllers/lcd_controller.cpp
+++ b/firmware/controllers/lcd_controller.cpp
@@ -117,13 +117,7 @@ void initLcdController(void) {
}
static char * prepareVBattMapLine(engine_configuration_s *engineConfiguration, char *buffer) {
- char *ptr = buffer;
- *ptr++ = 'V';
- ptr = ftoa(ptr, getVBatt(PASS_ENGINE_PARAMETER_F), 10.0f);
-
- ptr = appendStr(ptr, " M");
- ptr = ftoa(ptr, getRawMap(), 10.0f);
- return ptr;
+ return buffer + chsnprintf(buffer, 23,"V%10.0f M%10.0f", getVBatt(PASS_ENGINE_PARAMETER_F), getRawMap());
}
static char * prepareCltIatTpsLine(Engine *engine, char *buffer) {
diff --git a/firmware/controllers/trigger/rpm_calculator.cpp b/firmware/controllers/trigger/rpm_calculator.cpp
index 90f5af3bb9..c32033d94e 100644
--- a/firmware/controllers/trigger/rpm_calculator.cpp
+++ b/firmware/controllers/trigger/rpm_calculator.cpp
@@ -181,7 +181,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType,
efitick_t nowNt = getTimeNowNt();
engine->m.beforeRpmCb = GET_TIMESTAMP();
#if EFI_PROD_CODE
- efiAssertVoid(getRemainingStack(chThdSelf()) > 256, "lowstck#2z");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 256, "lowstck#2z");
#endif
#if EFI_SENSOR_CHART || defined(__DOXYGEN__)
diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp
index 486d5cfc97..534a9229cb 100644
--- a/firmware/controllers/trigger/trigger_central.cpp
+++ b/firmware/controllers/trigger/trigger_central.cpp
@@ -170,7 +170,7 @@ void hwHandleShaftSignal(trigger_event_e signal) {
if (triggerReentraint > maxTriggerReentraint)
maxTriggerReentraint = triggerReentraint;
triggerReentraint++;
- efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#8");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 128, "lowstck#8");
engine->triggerCentral.handleShaftSignal(signal PASS_ENGINE_PARAMETER);
triggerReentraint--;
triggerDuration = GET_TIMESTAMP() - triggerHanlderEntryTime;
diff --git a/firmware/controllers/trigger/trigger_decoder.cpp b/firmware/controllers/trigger/trigger_decoder.cpp
index 95497836c3..2ffe65fe14 100644
--- a/firmware/controllers/trigger/trigger_decoder.cpp
+++ b/firmware/controllers/trigger/trigger_decoder.cpp
@@ -483,7 +483,7 @@ static TriggerState initState CCM_OPTIONAL;
void TriggerShape::initializeTriggerShape(Logging *logger DECLARE_ENGINE_PARAMETER_S) {
const trigger_config_s *triggerConfig = &engineConfiguration->trigger;
#if EFI_PROD_CODE || defined(__DOXYGEN__)
- efiAssertVoid(getRemainingStack(chThdSelf()) > 256, "init t");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 256, "init t");
scheduleMsg(logger, "initializeTriggerShape(%s/%d)", getTrigger_type_e(triggerConfig->type), (int) triggerConfig->type);
#endif
@@ -676,7 +676,7 @@ static void onFindIndex(TriggerState *state) {
uint32_t findTriggerZeroEventIndex(TriggerState *state, TriggerShape * shape,
trigger_config_s const*triggerConfig DECLARE_ENGINE_PARAMETER_S) {
#if EFI_PROD_CODE || defined(__DOXYGEN__)
- efiAssert(getRemainingStack(chThdSelf()) > 128, "findPos", -1);
+ efiAssert(getRemainingStack(chThdGetSelfX()) > 128, "findPos", -1);
#endif
isInitializingTrigger = true;
errorDetection.clear();
diff --git a/firmware/controllers/trigger/trigger_structure.cpp b/firmware/controllers/trigger/trigger_structure.cpp
index 28045d2667..fa8a4aacf2 100644
--- a/firmware/controllers/trigger/trigger_structure.cpp
+++ b/firmware/controllers/trigger/trigger_structure.cpp
@@ -44,7 +44,7 @@ TriggerShape::TriggerShape() :
void TriggerShape::calculateTriggerSynchPoint(TriggerState *state DECLARE_ENGINE_PARAMETER_S) {
#if EFI_PROD_CODE || defined(__DOXYGEN__)
- efiAssertVoid(getRemainingStack(chThdSelf()) > 256, "calc s");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 256, "calc s");
#endif
trigger_config_s const*triggerConfig = &engineConfiguration->trigger;
diff --git a/firmware/ext/diskio.h b/firmware/ext/diskio.h
index 9573e6ecc7..4d72b910a8 100644
--- a/firmware/ext/diskio.h
+++ b/firmware/ext/diskio.h
@@ -1,11 +1,16 @@
-/*-----------------------------------------------------------------------
-/ Low level disk interface modlue include file
+/*-----------------------------------------------------------------------/
+/ Low level disk interface modlue include file (C)ChaN, 2013 /
/-----------------------------------------------------------------------*/
-#ifndef _DISKIO
+#ifndef _DISKIO_DEFINED
+#define _DISKIO_DEFINED
-#define _READONLY 0 /* 1: Remove write functions */
-#define _USE_IOCTL 1 /* 1: Use disk_ioctl fucntion */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define _USE_WRITE 1 /* 1: Enable disk_write function */
+#define _USE_IOCTL 1 /* 1: Enable disk_ioctl fucntion */
#include "integer.h"
@@ -26,15 +31,12 @@ typedef enum {
/*---------------------------------------*/
/* Prototypes for disk control functions */
-int assign_drives (int, int);
-DSTATUS disk_initialize (BYTE);
-DSTATUS disk_status (BYTE);
-DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);
-#if _READONLY == 0
-DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);
-#endif
-DRESULT disk_ioctl (BYTE, BYTE, void*);
+DSTATUS disk_initialize (BYTE pdrv);
+DSTATUS disk_status (BYTE pdrv);
+DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
+DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
+DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
/* Disk Status Bits (DSTATUS) */
@@ -46,17 +48,18 @@ DRESULT disk_ioctl (BYTE, BYTE, void*);
/* Command code for disk_ioctrl fucntion */
-/* Generic command (defined for FatFs) */
+/* Generic command (used by FatFs) */
#define CTRL_SYNC 0 /* Flush disk cache (for write functions) */
#define GET_SECTOR_COUNT 1 /* Get media size (for only f_mkfs()) */
#define GET_SECTOR_SIZE 2 /* Get sector size (for multiple sector size (_MAX_SS >= 1024)) */
#define GET_BLOCK_SIZE 3 /* Get erase block size (for only f_mkfs()) */
#define CTRL_ERASE_SECTOR 4 /* Force erased a block of sectors (for only _USE_ERASE) */
-/* Generic command */
+/* Generic command (not used by FatFs) */
#define CTRL_POWER 5 /* Get/Set power status */
#define CTRL_LOCK 6 /* Lock/Unlock media removal */
#define CTRL_EJECT 7 /* Eject media */
+#define CTRL_FORMAT 8 /* Create physical format on the media */
/* MMC/SDC specific ioctl command */
#define MMC_GET_TYPE 10 /* Get card type */
@@ -70,9 +73,8 @@ DRESULT disk_ioctl (BYTE, BYTE, void*);
#define ATA_GET_MODEL 21 /* Get model name */
#define ATA_GET_SN 22 /* Get serial number */
-/* NAND specific ioctl command */
-#define NAND_FORMAT 30 /* Create physical format */
-
-
-#define _DISKIO
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/firmware/ext/ff.h b/firmware/ext/ff.h
index b1ff46527c..a93d9a2d4a 100644
--- a/firmware/ext/ff.h
+++ b/firmware/ext/ff.h
@@ -1,11 +1,11 @@
/*---------------------------------------------------------------------------/
-/ FatFs - FAT file system module include file R0.09 (C)ChaN, 2011
+/ FatFs - FAT file system module include file R0.10b (C)ChaN, 2014
/----------------------------------------------------------------------------/
/ FatFs module is a generic FAT file system module for small embedded systems.
/ This is a free software that opened for education, research and commercial
-/ developments under license policy of following trems.
+/ developments under license policy of following terms.
/
-/ Copyright (C) 2011, ChaN, all right reserved.
+/ Copyright (C) 2014, ChaN, all right reserved.
/
/ * The FatFs module is a free software and there is NO WARRANTY.
/ * No restriction on use. You can use, modify and redistribute it for
@@ -15,7 +15,7 @@
/----------------------------------------------------------------------------*/
#ifndef _FATFS
-#define _FATFS 6502 /* Revision ID */
+#define _FATFS 8051 /* Revision ID */
#ifdef __cplusplus
extern "C" {
@@ -41,9 +41,9 @@ extern PARTITION VolToPart[]; /* Volume - Partition resolution table */
#define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive number */
#define LD2PT(vol) (VolToPart[vol].pt) /* Get partition index */
-#else /* Single partition configuration */
-#define LD2PD(vol) (vol) /* Each logical drive is bound to the same physical drive number */
-#define LD2PT(vol) 0 /* Always mounts the 1st partition or in SFD */
+#else /* Single partition configuration */
+#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is bound to the same physical drive number */
+#define LD2PT(vol) 0 /* Find first valid partition or in SFD */
#endif
@@ -53,7 +53,7 @@ extern PARTITION VolToPart[]; /* Volume - Partition resolution table */
#if _LFN_UNICODE /* Unicode string */
#if !_USE_LFN
-#error _LFN_UNICODE must be 0 in non-LFN cfg.
+#error _LFN_UNICODE must be 0 at non-LFN cfg.
#endif
#ifndef _INC_TCHAR
typedef WCHAR TCHAR;
@@ -78,12 +78,12 @@ typedef struct {
BYTE fs_type; /* FAT sub-type (0:Not mounted) */
BYTE drv; /* Physical drive number */
BYTE csize; /* Sectors per cluster (1,2,4...128) */
- BYTE n_fats; /* Number of FAT copies (1,2) */
- BYTE wflag; /* win[] dirty flag (1:must be written back) */
- BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */
+ BYTE n_fats; /* Number of FAT copies (1 or 2) */
+ BYTE wflag; /* win[] flag (b0:dirty) */
+ BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */
WORD id; /* File system mount ID */
WORD n_rootdir; /* Number of root directory entries (FAT12/16) */
-#if _MAX_SS != 512
+#if _MAX_SS != _MIN_SS
WORD ssize; /* Bytes per sector (512, 1024, 2048 or 4096) */
#endif
#if _FS_REENTRANT
@@ -92,18 +92,18 @@ typedef struct {
#if !_FS_READONLY
DWORD last_clust; /* Last allocated cluster */
DWORD free_clust; /* Number of free clusters */
- DWORD fsi_sector; /* fsinfo sector (FAT32) */
#endif
#if _FS_RPATH
DWORD cdir; /* Current directory start cluster (0:root) */
#endif
- DWORD n_fatent; /* Number of FAT entries (= number of clusters + 2) */
+ DWORD n_fatent; /* Number of FAT entries, = number of clusters + 2 */
DWORD fsize; /* Sectors per FAT */
+ DWORD volbase; /* Volume start sector */
DWORD fatbase; /* FAT start sector */
DWORD dirbase; /* Root directory start sector (FAT32:Cluster#) */
DWORD database; /* Data start sector */
DWORD winsect; /* Current sector appearing in the win[] */
- BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and Data on tiny cfg) */
+ BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */
} FATFS;
@@ -111,27 +111,27 @@ typedef struct {
/* File object structure (FIL) */
typedef struct {
- FATFS* fs; /* Pointer to the owner file system object */
- WORD id; /* Owner file system mount ID */
- BYTE flag; /* File status flags */
- BYTE pad1;
- DWORD fptr; /* File read/write pointer (0 on file open) */
+ FATFS* fs; /* Pointer to the related file system object (**do not change order**) */
+ WORD id; /* Owner file system mount ID (**do not change order**) */
+ BYTE flag; /* Status flags */
+ BYTE err; /* Abort flag (error code) */
+ DWORD fptr; /* File read/write pointer (Zeroed on file open) */
DWORD fsize; /* File size */
- DWORD sclust; /* File start cluster (0 when fsize==0) */
- DWORD clust; /* Current cluster */
- DWORD dsect; /* Current data sector */
+ DWORD sclust; /* File start cluster (0:no cluster chain, always 0 when fsize is 0) */
+ DWORD clust; /* Current cluster of fpter (not valid when fprt is 0) */
+ DWORD dsect; /* Sector number appearing in buf[] (0:invalid) */
#if !_FS_READONLY
- DWORD dir_sect; /* Sector containing the directory entry */
- BYTE* dir_ptr; /* Ponter to the directory entry in the window */
+ DWORD dir_sect; /* Sector number containing the directory entry */
+ BYTE* dir_ptr; /* Pointer to the directory entry in the win[] */
#endif
#if _USE_FASTSEEK
- DWORD* cltbl; /* Pointer to the cluster link map table (null on file open) */
+ DWORD* cltbl; /* Pointer to the cluster link map table (Nulled on file open) */
#endif
-#if _FS_SHARE
- UINT lockid; /* File lock ID (index of file semaphore table) */
+#if _FS_LOCK
+ UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */
#endif
#if !_FS_TINY
- BYTE buf[_MAX_SS]; /* File data read/write buffer */
+ BYTE buf[_MAX_SS]; /* File private data read/write window */
#endif
} FIL;
@@ -140,14 +140,17 @@ typedef struct {
/* Directory object structure (DIR) */
typedef struct {
- FATFS* fs; /* Pointer to the owner file system object */
- WORD id; /* Owner file system mount ID */
+ FATFS* fs; /* Pointer to the owner file system object (**do not change order**) */
+ WORD id; /* Owner file system mount ID (**do not change order**) */
WORD index; /* Current read/write index number */
DWORD sclust; /* Table start cluster (0:Root dir) */
DWORD clust; /* Current cluster */
DWORD sect; /* Current sector */
BYTE* dir; /* Pointer to the current SFN entry in the win[] */
BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
+#if _FS_LOCK
+ UINT lockid; /* File lock ID (index of file semaphore table Files[]) */
+#endif
#if _USE_LFN
WCHAR* lfn; /* Pointer to the LFN working buffer */
WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */
@@ -176,14 +179,14 @@ typedef struct {
typedef enum {
FR_OK = 0, /* (0) Succeeded */
- FR_DISK_ERR, /* (1) A hard error occured in the low level disk I/O layer */
+ FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */
FR_INT_ERR, /* (2) Assertion failed */
FR_NOT_READY, /* (3) The physical drive cannot work */
FR_NO_FILE, /* (4) Could not find the file */
FR_NO_PATH, /* (5) Could not find the path */
FR_INVALID_NAME, /* (6) The path name format is invalid */
- FR_DENIED, /* (7) Acces denied due to prohibited access or directory full */
- FR_EXIST, /* (8) Acces denied due to prohibited access */
+ FR_DENIED, /* (7) Access denied due to prohibited access or directory full */
+ FR_EXIST, /* (8) Access denied due to prohibited access */
FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */
FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */
FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */
@@ -191,7 +194,7 @@ typedef enum {
FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */
FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
- FR_LOCKED, /* (16) The operation is rejected according to the file shareing policy */
+ FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */
@@ -202,36 +205,39 @@ typedef enum {
/*--------------------------------------------------------------*/
/* FatFs module application interface */
-FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */
-FRESULT f_open (FIL*, const TCHAR*, BYTE); /* Open or create a file */
-FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */
-FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */
-FRESULT f_close (FIL*); /* Close an open file object */
-FRESULT f_opendir (DIR*, const TCHAR*); /* Open an existing directory */
-FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */
-FRESULT f_stat (const TCHAR*, FILINFO*); /* Get file status */
-FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */
-FRESULT f_getfree (const TCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */
-FRESULT f_truncate (FIL*); /* Truncate file */
-FRESULT f_sync (FIL*); /* Flush cached data of a writing file */
-FRESULT f_unlink (const TCHAR*); /* Delete an existing file or directory */
-FRESULT f_mkdir (const TCHAR*); /* Create a new directory */
-FRESULT f_chmod (const TCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */
-FRESULT f_utime (const TCHAR*, const FILINFO*); /* Change timestamp of the file/dir */
-FRESULT f_rename (const TCHAR*, const TCHAR*); /* Rename/Move a file or directory */
-FRESULT f_chdrive (BYTE); /* Change current drive */
-FRESULT f_chdir (const TCHAR*); /* Change current directory */
-FRESULT f_getcwd (TCHAR*, UINT); /* Get current directory */
-FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */
-FRESULT f_mkfs (BYTE, BYTE, UINT); /* Create a file system on the drive */
-FRESULT f_fdisk (BYTE, const DWORD[], void*); /* Divide a physical drive into some partitions */
-int f_putc (TCHAR, FIL*); /* Put a character to the file */
-int f_puts (const TCHAR*, FIL*); /* Put a string to the file */
-int f_printf (FIL*, const TCHAR*, ...); /* Put a formatted string to the file */
-TCHAR* f_gets (TCHAR*, int, FIL*); /* Get a string from the file */
+FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */
+FRESULT f_close (FIL* fp); /* Close an open file object */
+FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from a file */
+FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to a file */
+FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */
+FRESULT f_lseek (FIL* fp, DWORD ofs); /* Move file pointer of a file object */
+FRESULT f_truncate (FIL* fp); /* Truncate file */
+FRESULT f_sync (FIL* fp); /* Flush cached data of a writing file */
+FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */
+FRESULT f_closedir (DIR* dp); /* Close an open directory */
+FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */
+FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */
+FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */
+FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */
+FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */
+FRESULT f_chmod (const TCHAR* path, BYTE value, BYTE mask); /* Change attribute of the file/dir */
+FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change times-tamp of the file/dir */
+FRESULT f_chdir (const TCHAR* path); /* Change current directory */
+FRESULT f_chdrive (const TCHAR* path); /* Change current drive */
+FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */
+FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */
+FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */
+FRESULT f_setlabel (const TCHAR* label); /* Set volume label */
+FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */
+FRESULT f_mkfs (const TCHAR* path, BYTE sfd, UINT au); /* Create a file system on the volume */
+FRESULT f_fdisk (BYTE pdrv, const DWORD szt[], void* work); /* Divide a physical drive into some partitions */
+int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */
+int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */
+int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */
+TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */
#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0)
-#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0)
+#define f_error(fp) ((fp)->err)
#define f_tell(fp) ((fp)->fptr)
#define f_size(fp) ((fp)->fsize)
@@ -251,21 +257,21 @@ DWORD get_fattime (void);
#endif
/* Unicode support functions */
-#if _USE_LFN /* Unicode - OEM code conversion */
-WCHAR ff_convert (WCHAR, UINT); /* OEM-Unicode bidirectional conversion */
-WCHAR ff_wtoupper (WCHAR); /* Unicode upper-case conversion */
-#if _USE_LFN == 3 /* Memory functions */
-void* ff_memalloc (UINT); /* Allocate memory block */
-void ff_memfree (void*); /* Free memory block */
+#if _USE_LFN /* Unicode - OEM code conversion */
+WCHAR ff_convert (WCHAR chr, UINT dir); /* OEM-Unicode bidirectional conversion */
+WCHAR ff_wtoupper (WCHAR chr); /* Unicode upper-case conversion */
+#if _USE_LFN == 3 /* Memory functions */
+void* ff_memalloc (UINT msize); /* Allocate memory block */
+void ff_memfree (void* mblock); /* Free memory block */
#endif
#endif
/* Sync functions */
#if _FS_REENTRANT
-int ff_cre_syncobj (BYTE, _SYNC_t*);/* Create a sync object */
-int ff_req_grant (_SYNC_t); /* Lock sync object */
-void ff_rel_grant (_SYNC_t); /* Unlock sync object */
-int ff_del_syncobj (_SYNC_t); /* Delete a sync object */
+int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj); /* Create a sync object */
+int ff_req_grant (_SYNC_t sobj); /* Lock sync object */
+void ff_rel_grant (_SYNC_t sobj); /* Unlock sync object */
+int ff_del_syncobj (_SYNC_t sobj); /* Delete a sync object */
#endif
@@ -279,7 +285,6 @@ int ff_del_syncobj (_SYNC_t); /* Delete a sync object */
#define FA_READ 0x01
#define FA_OPEN_EXISTING 0x00
-#define FA__ERROR 0x80
#if !_FS_READONLY
#define FA_WRITE 0x02
diff --git a/firmware/ext/ffconf.h b/firmware/ext/ffconf.h
index 0ba6d6ddf2..0f13b23297 100644
--- a/firmware/ext/ffconf.h
+++ b/firmware/ext/ffconf.h
@@ -2,41 +2,38 @@
#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.
-/
-/----------------------------------------------------------------------------*/
+/ FatFs - FAT file system module configuration file R0.10b (C)ChaN, 2014
+/---------------------------------------------------------------------------*/
+
#ifndef _FFCONF
-#define _FFCONF 6502 /* Revision ID */
+#define _FFCONF 8051 /* 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. */
+/* When _FS_TINY is set to 1, it reduces memory consumption _MAX_SS bytes each
+/ file object. For file data transfer, FatFs uses the common sector buffer in
+/ the file system object (FATFS) instead of private sector buffer eliminated
+/ from the file object (FIL). */
#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. */
+/ 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.
+/* The _FS_MINIMIZE option defines minimization level to remove API 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. */
+/ 0: All basic functions are enabled.
+/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(),
+/ f_truncate() and f_rename() function are removed.
+/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
+/ 3: f_lseek() function is removed in addition to 2. */
#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */
@@ -44,27 +41,30 @@
#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 1 /* 0:Disable or 1:Enable */
-/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */
+/* To enable f_mkfs() function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */
/* To enable fast seek feature, set _USE_FASTSEEK to 1. */
+#define _USE_LABEL 0 /* 0:Disable or 1:Enable */
+/* To enable volume label functions, set _USE_LAVEL to 1 */
+
+
+#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. */
+
/*---------------------------------------------------------------------------/
/ 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)
+/ 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)
@@ -89,105 +89,142 @@
/ 857 - Turkish (OEM)
/ 862 - Hebrew (OEM)
/ 874 - Thai (OEM, Windows)
-/ 1 - ASCII only (Valid for non LFN cfg.)
-*/
+/ 1 - ASCII (Valid for only non-LFN configuration) */
#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.
+/* The _USE_LFN option switches the LFN feature.
/
-/ 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.
+/ 0: Disable LFN feature. _MAX_LFN has no effect.
+/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
/ 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. */
+/ When enable LFN feature, Unicode handling functions ff_convert() and ff_wtoupper()
+/ function must be added to the project.
+/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. When use stack for the
+/ working buffer, take care on stack overflow. When use heap memory for the working
+/ buffer, memory management 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. */
+/* To switch the character encoding on the FatFs API (TCHAR) to Unicode, enable LFN
+/ feature and set _LFN_UNICODE to 1. This option affects behavior of string I/O
+/ functions. This option must be 0 when LFN feature is not enabled. */
+
+
+#define _STRF_ENCODE 3 /* 0:ANSI/OEM, 1:UTF-16LE, 2:UTF-16BE, 3:UTF-8 */
+/* When Unicode API is enabled by _LFN_UNICODE option, this option selects the character
+/ encoding on the file to be read/written via string I/O functions, f_gets(), f_putc(),
+/ f_puts and f_printf(). This option has no effect when Unicode API is not enabled. */
#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.
+/ 1: Enable relative path. f_chdrive() and f_chdir() function are available.
+/ 2: f_getcwd() function is available in addition to 1.
/
-/ Note that output of the f_readdir fnction is affected by this option. */
-
+/ Note that output of the f_readdir() fnction is affected by this option. */
/*---------------------------------------------------------------------------/
-/ Physical Drive Configurations
-/----------------------------------------------------------------------------*/
+/ Drive/Volume 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 _STR_VOLUME_ID 0 /* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */
+#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3"
+/* When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive
+/ number in the path name. _VOLUME_STRS defines the drive ID strings for each logical
+/ drives. Number of items must be equal to _VOLUMES. Valid characters for the drive ID
+/ strings are: 0-9 and A-Z. */
-#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 _MULTI_PARTITION 0 /* 0:Single partition, 1:Enable multiple partition */
+/* By default(0), each logical drive number is bound to the same physical drive number
+/ and only a FAT volume found on the physical drive is mounted. When it is set to 1,
+/ each logical drive number is bound to arbitrary drive/partition listed in VolToPart[].
+*/
+
+
+#define _MIN_SS 512
+#define _MAX_SS 512
+/* These options configure the range of sector size to be supported. (512, 1024, 2048 or
+/ 4096) Always set both 512 for most systems, all memory card and harddisk. But a larger
+/ value may be required for on-board flash memory and some type of optical media.
+/ When _MAX_SS is larger than _MIN_SS, FatFs is configured to variable sector size and
+/ GET_SECTOR_SIZE command must be implemented to the disk_ioctl() function. */
#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. */
+/* To enable sector erase feature, set _USE_ERASE to 1. Also CTRL_ERASE_SECTOR command
+/ should be added to the disk_ioctl() function. */
+
+
+#define _FS_NOFSINFO 0 /* 0 to 3 */
+/* If you need to know correct free space on the FAT32 volume, set bit 0 of this option
+/ and f_getfree() function at first time after volume mount will force a full FAT scan.
+/ Bit 1 controls the last allocated cluster number as bit 0.
+/
+/ bit0=0: Use free cluster count in the FSINFO if available.
+/ bit0=1: Do not trust free cluster count in the FSINFO.
+/ bit1=0: Use last allocated cluster number in the FSINFO if available.
+/ bit1=1: Do not trust last allocated cluster number in the FSINFO.
+*/
/*---------------------------------------------------------------------------/
/ 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.
+#define _FS_LOCK 0 /* 0:Disable or >=1:Enable */
+/* To enable file lock control feature, set _FS_LOCK to non-zero value.
+/ The value defines how many files/sub-directories can be opened simultaneously
+/ with file lock control. This feature uses bss _FS_LOCK * 12 bytes. */
+
+
+#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */
+#define _FS_TIMEOUT MS2ST(1000) /* Timeout period in unit of time tick */
+#define _SYNC_t semaphore_t* /* O/S dependent sync object type. e.g. HANDLE, OS_EVENT*, ID, SemaphoreHandle_t and etc.. */
+/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs module.
/
-/ 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.
+/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect.
+/ 1: Enable re-entrancy. 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.
*/
-/* 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.
+#define _WORD_ACCESS 0 /* 0 or 1 */
+/* The _WORD_ACCESS option is an only platform dependent option. It defines
+/ which access method is used to the word data on the FAT volume.
/
-/ 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. */
+/ 0: Byte-by-byte access. Always compatible with all platforms.
+/ 1: Word access. Do not choose this unless under both the following conditions.
+/
+/ * Address misaligned memory access is always allowed for ALL instructions.
+/ * Byte order on the memory is little-endian.
+/
+/ If it is the case, _WORD_ACCESS can also be set to 1 to improve performance and
+/ reduce code size. Following table shows an example of some processor types.
+/
+/ ARM7TDMI 0 ColdFire 0 V850E2 0
+/ Cortex-M3 0 Z80 0/1 V850ES 0/1
+/ Cortex-M0 0 RX600(LE) 0/1 TLCS-870 0/1
+/ AVR 0/1 RX600(BE) 0 TLCS-900 0/1
+/ AVR32 0 RL78 0 R32C 0
+/ PIC18 0/1 SH-2 0 M16C 0/1
+/ PIC24 0 H8S 0 MSP430 0
+/ PIC32 0 H8/300H 0 x86 0/1
+*/
-#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 */
+#endif /* _FFCONF */
diff --git a/firmware/ext/ffconf_old.h b/firmware/ext/ffconf_old.h
new file mode 100644
index 0000000000..0ba6d6ddf2
--- /dev/null
+++ b/firmware/ext/ffconf_old.h
@@ -0,0 +1,193 @@
+/* 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 1 /* 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 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 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/firmware/ext/readme.txt b/firmware/ext/readme.txt
index fa761829a5..e76920959f 100644
--- a/firmware/ext/readme.txt
+++ b/firmware/ext/readme.txt
@@ -1 +1,158 @@
-In this folder we have 3rd party code
\ No newline at end of file
+FatFs Module Source Files R0.10b (C)ChaN, 2014
+
+
+FILES
+
+ ffconf.h Configuration file for FatFs module.
+ ff.h Common include file for FatFs and application module.
+ ff.c FatFs module.
+ diskio.h Common include file for FatFs and disk I/O module.
+ diskio.c An example of glue function to attach existing disk I/O module to FatFs.
+ integer.h Integer type definitions for FatFs.
+ option Optional external functions.
+
+ Low level disk I/O module is not included in this archive because the FatFs
+ module is only a generic file system layer and not depend on any specific
+ storage device. You have to provide a low level disk I/O module that written
+ to control your storage device.
+
+
+
+AGREEMENTS
+
+ FatFs module is an open source software to implement FAT file system to
+ small embedded systems. This is a free software and is opened for education,
+ research and commercial developments under license policy of following trems.
+
+ Copyright (C) 2014, ChaN, all right reserved.
+
+ * The FatFs module is a free software and there is NO WARRANTY.
+ * No restriction on use. You can use, modify and redistribute it for
+ personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY.
+ * Redistributions of source code must retain the above copyright notice.
+
+
+
+REVISION HISTORY
+
+ Feb 26, 2006 R0.00 Prototype
+
+ Apr 29, 2006 R0.01 First release.
+
+ Jun 01, 2006 R0.02 Added FAT12.
+ Removed unbuffered mode.
+ Fixed a problem on small (<32M) patition.
+
+ Jun 10, 2006 R0.02a Added a configuration option _FS_MINIMUM.
+
+ Sep 22, 2006 R0.03 Added f_rename.
+ Changed option _FS_MINIMUM to _FS_MINIMIZE.
+
+ Dec 11, 2006 R0.03a Improved cluster scan algolithm to write files fast.
+ Fixed f_mkdir creates incorrect directory on FAT32.
+
+ Feb 04, 2007 R0.04 Supported multiple drive system. (FatFs)
+ Changed some APIs for multiple drive system.
+ Added f_mkfs. (FatFs)
+ Added _USE_FAT32 option. (Tiny-FatFs)
+
+ Apr 01, 2007 R0.04a Supported multiple partitions on a plysical drive. (FatFs)
+ Fixed an endian sensitive code in f_mkfs. (FatFs)
+ Added a capability of extending the file size to f_lseek.
+ Added minimization level 3.
+ Fixed a problem that can collapse a sector when recreate an
+ existing file in any sub-directory at non FAT32 cfg. (Tiny-FatFs)
+
+ May 05, 2007 R0.04b Added _USE_NTFLAG option.
+ Added FSInfo support.
+ Fixed some problems corresponds to FAT32. (Tiny-FatFs)
+ Fixed DBCS name can result FR_INVALID_NAME.
+ Fixed short seek (0 < ofs <= csize) collapses the file object.
+
+ Aug 25, 2007 R0.05 Changed arguments of f_read, f_write.
+ Changed arguments of f_mkfs. (FatFs)
+ Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs)
+ Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs)
+
+ Feb 03, 2008 R0.05a Added f_truncate().
+ Added f_utime().
+ Fixed off by one error at FAT sub-type determination.
+ Fixed btr in f_read() can be mistruncated.
+ Fixed cached sector is not flushed when create and close without write.
+
+ Apr 01, 2008 R0.06 Added f_forward(). (Tiny-FatFs)
+ Added string functions: fputc(), fputs(), fprintf() and fgets().
+ Improved performance of f_lseek() on move to the same or following cluster.
+
+ Apr 01, 2009, R0.07 Merged Tiny-FatFs as a buffer configuration option.
+ Added long file name support.
+ Added multiple code page support.
+ Added re-entrancy for multitask operation.
+ Added auto cluster size selection to f_mkfs().
+ Added rewind option to f_readdir().
+ Changed result code of critical errors.
+ Renamed string functions to avoid name collision.
+
+ Apr 14, 2009, R0.07a Separated out OS dependent code on reentrant cfg.
+ Added multiple sector size support.
+
+ Jun 21, 2009, R0.07c Fixed f_unlink() may return FR_OK on error.
+ Fixed wrong cache control in f_lseek().
+ Added relative path feature.
+ Added f_chdir().
+ Added f_chdrive().
+ Added proper case conversion for extended characters.
+
+ Nov 03, 2009 R0.07e Separated out configuration options from ff.h to ffconf.h.
+ Added a configuration option, _LFN_UNICODE.
+ Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH.
+ Fixed name matching error on the 13 char boundary.
+ Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.
+
+ May 15, 2010, R0.08 Added a memory configuration option. (_USE_LFN)
+ Added file lock feature. (_FS_SHARE)
+ Added fast seek feature. (_USE_FASTSEEK)
+ Changed some types on the API, XCHAR->TCHAR.
+ Changed fname member in the FILINFO structure on Unicode cfg.
+ String functions support UTF-8 encoding files on Unicode cfg.
+
+ Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2)
+ Added sector erase feature. (_USE_ERASE)
+ Moved file lock semaphore table from fs object to the bss.
+ Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'.
+ Fixed f_mkfs() creates wrong FAT32 volume.
+
+ Jan 15,'11 R0.08b Fast seek feature is also applied to f_read() and f_write().
+ f_lseek() reports required table size on creating CLMP.
+ Extended format syntax of f_printf function.
+ Ignores duplicated directory separators in given path names.
+
+ Sep 06,'11 R0.09 f_mkfs() supports multiple partition to finish the multiple partition feature.
+ Added f_fdisk(). (_MULTI_PARTITION = 2)
+
+ Aug 27,'12 R0.09a Fixed assertion failure due to OS/2 EA on FAT12/16.
+ Changed f_open() and f_opendir() reject null object pointer to avoid crash.
+ Changed option name _FS_SHARE to _FS_LOCK.
+
+ Jan 23,'13 R0.09b Added f_getlabel() and f_setlabel(). (_USE_LABEL)
+
+ Oct 02,'13 R0.10 Added selection of character encoding on the file. (_STRF_ENCODE)
+ Added f_closedir().
+ Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO)
+ Added forced mount feature with changes of f_mount().
+ Improved behavior of volume auto detection.
+ Improved write throughput of f_puts() and f_printf().
+ Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write().
+ Fixed f_write() can be truncated when the file size is close to 4GB.
+ Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect error code.
+
+ Jan 15,'14 R0.10a Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID)
+ Added a configuration option of minimum sector size. (_MIN_SS)
+ 2nd argument of f_rename() can have a drive number and it will be ignored.
+ Fixed f_mount() with forced mount fails when drive number is >= 1.
+ Fixed f_close() invalidates the file object without volume lock.
+ Fixed f_closedir() returns but the volume lock is left acquired.
+ Fixed creation of an entry with LFN fails on too many SFN collisions.
+
+ Mar 19,'14 R0.10b Fixed a hard error in the disk I/O layer can collapse the directory entry.
+ Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN.
diff --git a/firmware/global.h b/firmware/global.h
index 5f8a0715a1..132fbe1d60 100644
--- a/firmware/global.h
+++ b/firmware/global.h
@@ -8,8 +8,18 @@
#ifndef GLOBAL_H_
#define GLOBAL_H_
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
#include
#include
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
#include
#define DEFAULT_ENGINE_TYPE CUSTOM_ENGINE
@@ -48,31 +58,13 @@ typedef unsigned int time_t;
#define EFI_ERROR_CODE 0xffffffff
#if EFI_USE_CCM && defined __GNUC__
-#define CCM_OPTIONAL __attribute__((section(".ccm")))
+#define CCM_OPTIONAL __attribute__((section(".ram4")))
#elif defined __GNUC__
#define CCM_OPTIONAL
#else
-#define CCM_OPTIONAL @ ".ccm"
+#define CCM_OPTIONAL @ ".ram4"
#endif
-// this stuff is about ChibiOS 2.6 > Migration
-typedef VirtualTimer virtual_timer_t;
-typedef EventListener event_listener_t;
-typedef Thread thread_t;
-typedef EventListener event_listener_t;
-typedef EventSource event_source_t;
-typedef VTList virtual_timers_list_t;
-typedef VirtualTimer virtual_timer_t;
-#define chSysLockFromISR chSysLockFromIsr
-#define chSysUnlockFromISR chSysUnlockFromIsr
-#define chThdGetSelfX chThdSelf
-
-#define HAL_SUCCESS CH_SUCCESS
-#define HAL_FAILED CH_FAILED
-
-#define THD_WORKING_AREA WORKING_AREA
-#define THD_FUNCTION(tname, arg) void tname(void *arg)
-
#if EFI_PROD_CODE || defined(__DOXYGEN__)
/**
@@ -128,5 +120,9 @@ typedef VirtualTimer virtual_timer_t;
turnAllPinsOff(); \
enginePins.communicationPin.setValue(1);
+/*
+ * Stack debugging
+ */
+int getRemainingStack(thread_t *otp);
#endif /* GLOBAL_H_ */
diff --git a/firmware/hw_layer/HIP9011.cpp b/firmware/hw_layer/HIP9011.cpp
index 45564009cf..b302ee10f7 100644
--- a/firmware/hw_layer/HIP9011.cpp
+++ b/firmware/hw_layer/HIP9011.cpp
@@ -194,7 +194,7 @@ void setHip9011FrankensoPinout(void) {
// todo: convert this to rusEfi, hardware-independent enum
engineConfiguration->spi2SckMode = PAL_STM32_OTYPE_OPENDRAIN; // 4
engineConfiguration->spi2MosiMode = PAL_STM32_OTYPE_OPENDRAIN; // 4
- engineConfiguration->spi2MisoMode = PAL_STM32_PUDR_PULLUP; // 32
+ engineConfiguration->spi2MisoMode = PAL_STM32_PUPDR_PULLUP; // 32
boardConfiguration->hip9011Gain = 1;
engineConfiguration->knockVThreshold = 4;
diff --git a/firmware/hw_layer/can_hw.cpp b/firmware/hw_layer/can_hw.cpp
index fa8c419ca6..b7f9607190 100644
--- a/firmware/hw_layer/can_hw.cpp
+++ b/firmware/hw_layer/can_hw.cpp
@@ -94,7 +94,7 @@ void sendMessage2(int size) {
txmsg.DLC = size;
// 1 second timeout
msg_t result = canTransmit(&EFI_CAN_DEVICE, CAN_ANY_MAILBOX, &txmsg, MS2ST(1000));
- if (result == RDY_OK) {
+ if (result == MSG_OK) {
canWriteOk++;
} else {
canWriteNotOk++;
@@ -201,7 +201,7 @@ static void canInfoNBCBroadcast(can_nbc_e typeOfNBC) {
static void canRead(void) {
// scheduleMsg(&logger, "Waiting for CAN");
msg_t result = canReceive(&EFI_CAN_DEVICE, CAN_ANY_MAILBOX, &rxBuffer, MS2ST(1000));
- if (result == RDY_TIMEOUT) {
+ if (result == MSG_TIMEOUT) {
return;
}
diff --git a/firmware/hw_layer/digital_input_hw.cpp b/firmware/hw_layer/digital_input_hw.cpp
index 428f90b226..1b349a58ab 100644
--- a/firmware/hw_layer/digital_input_hw.cpp
+++ b/firmware/hw_layer/digital_input_hw.cpp
@@ -197,12 +197,12 @@ void startInputDriver(digital_input_s *hw, bool isActiveHigh) {
if (driver != NULL) {
if (hw->started) {
- icuDisable(driver);
+ icuDisableNotificationsI(driver);
icuStop(driver);
}
wave_icucfg.channel = getInputCaptureChannel(hw->brainPin);
efiIcuStart(driver, &wave_icucfg);
- icuEnable(driver);
+ icuEnableNotifications(driver);
}
hw->started = true;
}
diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp
index 4f020ae5e0..3563ca419b 100644
--- a/firmware/hw_layer/hardware.cpp
+++ b/firmware/hw_layer/hardware.cpp
@@ -54,7 +54,7 @@ EXTERN_ENGINE
;
extern bool hasFirmwareErrorFlag;
-static Mutex spiMtx;
+static mutex_t spiMtx;
int maxNesting = 0;
@@ -70,13 +70,13 @@ bool rtcWorks = true;
* Only one consumer can use SPI bus at a given time
*/
void lockSpi(spi_device_e device) {
- efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lockSpi");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 128, "lockSpi");
// todo: different locks for different SPI devices!
chMtxLock(&spiMtx);
}
void unlockSpi(void) {
- chMtxUnlock();
+ chMtxUnlock(&spiMtx);
}
static void initSpiModules(board_configuration_s *boardConfiguration) {
@@ -155,7 +155,7 @@ extern int tpsFastAdc;
* This method is not in the adc* lower-level file because it is more business logic then hardware.
*/
void adc_callback_fast(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
- efiAssertVoid(getRemainingStack(chThdSelf()) > 64, "lowstck12a");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 64, "lowstck12a");
(void) buffer;
(void) n;
@@ -167,7 +167,7 @@ void adc_callback_fast(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
/**
* this callback is executed 10 000 times a second, it needs to be as fast as possible
*/
- efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#9b");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 128, "lowstck#9b");
#if EFI_MAP_AVERAGING
mapAveragingCallback(fastAdc.samples[fastMapSampleIndex]);
@@ -303,7 +303,7 @@ void showBor(void) {
}
void initHardware(Logging *l) {
- efiAssertVoid(getRemainingStack(chThdSelf()) > 256, "init h");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 256, "init h");
sharedLogger = l;
engine_configuration_s *engineConfiguration = engine->engineConfiguration;
efiAssertVoid(engineConfiguration!=NULL, "engineConfiguration");
@@ -314,7 +314,7 @@ void initHardware(Logging *l) {
// 10 extra seconds to re-flash the chip
//flashProtect();
- chMtxInit(&spiMtx);
+ chMtxObjectInit(&spiMtx);
#if EFI_HISTOGRAMS
/**
diff --git a/firmware/hw_layer/mass_storage/usb_msd.c b/firmware/hw_layer/mass_storage/usb_msd.c
index 026fc77421..50ff41d560 100644
--- a/firmware/hw_layer/mass_storage/usb_msd.c
+++ b/firmware/hw_layer/mass_storage/usb_msd.c
@@ -31,8 +31,8 @@
#include "ch.h"
#include "hal.h"
#include "usb_msd.h"
-#include "chprintf.h"
#include "string.h"
+#include "chprintf.h"
#if HAL_USE_MASS_STORAGE_USB || defined(__DOXYGEN__)
@@ -92,33 +92,21 @@
-static msg_t MassStorageUSBTransferThd(void *arg);
-static msg_t MassStorageThd(void *arg);
+static THD_FUNCTION(MassStorageUSBTransferThd, arg);
+static THD_FUNCTION(MassStorageThd, arg);
-static Thread *msdThd = NULL;
-static Thread *msdUSBTransferThd = NULL;
+static thread_t *msdThd = NULL;
+static thread_t *msdUSBTransferThd = NULL;
#define WAIT_ISR_SUCCESS 0
#define WAIT_ISR_BUSS_RESET_OR_RECONNECT 1
-static uint8_t msdWaitForISR(USBMassStorageDriver *msdp, const bool_t check_reset, const msd_wait_mode_t wait_mode);
+static uint8_t msdWaitForISR(USBMassStorageDriver *msdp, const bool check_reset, const msd_wait_mode_t wait_mode);
static void msdSetDefaultSenseKey(USBMassStorageDriver *msdp);
#define BLOCK_SIZE_INCREMENT 512
#define BLOCK_WRITE_ITTERATION_COUNT 16
-#define MSD_START_TRANSMIT(msdp) \
- chSysLock(); \
- msdp->bulk_in_interupt_flag = false; \
- usbStartTransmitI(msdp->usbp, msdp->ms_ep_number); \
- chSysUnlock();
-
-
-#define MSD_START_RECEIVED(msdp) \
- chSysLock(); \
- msdp->bulk_out_interupt_flag = false; \
- usbStartReceiveI(msdp->usbp, msdp->ms_ep_number); \
- chSysUnlock();
typedef enum {
MSD_USB_TRANSFER_STATUS_RUNNING = 0,
@@ -176,13 +164,13 @@ void msdBulkInCallbackComplete(USBDriver *usbp, usbep_t ep) {
if (ep > 0 && usbp->in_params[ep - 1] != NULL) {
USBMassStorageDriver *msdp = (USBMassStorageDriver *)usbp->in_params[ep - 1];
- chSysLockFromIsr();
+ chSysLockFromISR();
chBSemSignalI(&(msdp->bsem));
msdp->bulk_in_interupt_flag = true;
- chSysUnlockFromIsr();
+ chSysUnlockFromISR();
}
}
@@ -201,12 +189,12 @@ void msdBulkOutCallbackComplete(USBDriver *usbp, usbep_t ep) {
if (ep > 0 && usbp->in_params[ep - 1] != NULL) {
USBMassStorageDriver *msdp = (USBMassStorageDriver *)usbp->in_params[ep - 1];
- chSysLockFromIsr();
+ chSysLockFromISR();
chBSemSignalI(&(msdp->bsem));
msdp->bulk_out_interupt_flag = true;
- chSysUnlockFromIsr();
+ chSysUnlockFromISR();
}
}
@@ -243,15 +231,15 @@ usb_msd_driver_state_t msdInit(USBDriver *usbp, BaseBlockDevice *bbdp, USBMassSt
msdp->enable_media_removial = true;
msdp->block_dev_info_valid_flag = false;
- chEvtInit(&msdp->evt_connected);
- chEvtInit(&msdp->evt_ejected);
+ chEvtObjectInit(&msdp->evt_connected);
+ chEvtObjectInit(&msdp->evt_ejected);
/* Initialize binary semaphore as taken, will cause the thread to initially
* wait on the */
- chBSemInit(&msdp->bsem, TRUE);
+ chBSemObjectInit(&msdp->bsem, TRUE);
/* Initialize binary semaphore as NOT taken */
- chBSemInit(&msdp->usb_transfer_thread_bsem, FALSE);
- chBSemInit(&msdp->mass_sorage_thd_bsem, FALSE);
+ chBSemObjectInit(&msdp->usb_transfer_thread_bsem, FALSE);
+ chBSemObjectInit(&msdp->mass_sorage_thd_bsem, FALSE);
/* Initialize sense structure to zero */
memset(&msdp->sense, 0, sizeof(msdp->sense));
@@ -312,11 +300,11 @@ usb_msd_driver_state_t msdStop(USBMassStorageDriver *msdp) {
if (msdThd != NULL) {
chThdTerminate(msdThd);
int i;
- for(i = 0; i < 20 && msdThd->p_state != THD_STATE_FINAL; i++ ) {
+ for(i = 0; i < 20 && msdThd->p_state != CH_STATE_FINAL; i++ ) {
chThdSleepMilliseconds(20);
}
- if( msdThd->p_state == THD_STATE_FINAL ) {
+ if( msdThd->p_state == CH_STATE_FINAL ) {
final_state = USB_MSD_DRIVER_ERROR;
}
msdThd = NULL;
@@ -326,11 +314,11 @@ usb_msd_driver_state_t msdStop(USBMassStorageDriver *msdp) {
if (msdUSBTransferThd == NULL) {
chThdTerminate(msdUSBTransferThd);
int i;
- for(i = 0; i < 20 && msdUSBTransferThd->p_state != THD_STATE_FINAL; i++ ) {
+ for(i = 0; i < 20 && msdUSBTransferThd->p_state != CH_STATE_FINAL; i++ ) {
chThdSleepMilliseconds(20);
}
- if( msdUSBTransferThd->p_state == THD_STATE_FINAL ) {
+ if( msdUSBTransferThd->p_state == CH_STATE_FINAL ) {
final_state = USB_MSD_DRIVER_ERROR;
}
msdUSBTransferThd = NULL;
@@ -352,7 +340,7 @@ usb_msd_driver_state_t msdStop(USBMassStorageDriver *msdp) {
*
* @api
*/
-bool_t msdRequestsHook(USBDriver *usbp) {
+bool msdRequestsHook(USBDriver *usbp) {
return(msdRequestsHook2(usbp, NULL));
}
@@ -367,7 +355,7 @@ bool_t msdRequestsHook(USBDriver *usbp) {
*
* @api
*/
-bool_t msdRequestsHook2(USBDriver *usbp, USBMassStorageDriver *msdp) {
+bool msdRequestsHook2(USBDriver *usbp, USBMassStorageDriver *msdp) {
if (((usbp->setup[0] & USB_RTYPE_TYPE_MASK) == USB_RTYPE_TYPE_CLASS)
&& ((usbp->setup[0] & USB_RTYPE_RECIPIENT_MASK)
== USB_RTYPE_RECIPIENT_INTERFACE)) {
@@ -439,14 +427,14 @@ const char* usb_msd_driver_state_t_to_str(const usb_msd_driver_state_t driver_st
/* Event Flow Functions */
-static uint8_t msdWaitForISR(USBMassStorageDriver *msdp, const bool_t check_reset, const msd_wait_mode_t wait_mode) {
+static uint8_t msdWaitForISR(USBMassStorageDriver *msdp, const bool check_reset, const msd_wait_mode_t wait_mode) {
uint8_t ret = WAIT_ISR_SUCCESS;
/* sleep until the ISR completes */
chSysLock();
msd_debug_print(msdp->chp, "WaitISR(mode=%d)\r\n", wait_mode);
for (;;) {
const msg_t m = chBSemWaitTimeoutS(&msdp->bsem, 1);
- if (m == RDY_OK && wait_mode == MSD_WAIT_MODE_NONE ) {
+ if (m == MSG_OK && wait_mode == MSD_WAIT_MODE_NONE ) {
break;
}
@@ -461,7 +449,7 @@ static uint8_t msdWaitForISR(USBMassStorageDriver *msdp, const bool_t check_rese
break;
}
- if( chThdShouldTerminate() ) {
+ if( chThdShouldTerminateX() ) {
break;
}
}
@@ -546,23 +534,18 @@ static msd_wait_mode_t SCSICommandInquiry(USBMassStorageDriver *msdp) {
msdp->command_succeeded_flag = false;
}
- usbPrepareTransmit(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->data.scsi_inquiry_response,
+ usbStartTransmitI(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->data.scsi_inquiry_response,
sizeof(scsi_inquiry_response_t));
-
- MSD_START_TRANSMIT(msdp);
-
/* wait for ISR */
return MSD_WAIT_MODE_BULK_IN;
}
static msd_wait_mode_t SCSICommandRequestSense(USBMassStorageDriver *msdp) {
//This command should not affect the sense key
- usbPrepareTransmit(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->sense,
+ usbStartTransmitI(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->sense,
sizeof(scsi_sense_response_t));
- MSD_START_TRANSMIT(msdp);
-
/* wait for ISR */
return MSD_WAIT_MODE_BULK_IN;
}
@@ -576,11 +559,9 @@ static msd_wait_mode_t SCSICommandReadFormatCapacity(USBMassStorageDriver *msdp)
msdp->data.format_capacity_response.last_block_addr = swap_uint32(msdp->block_dev_info.blk_num - 1);
msdp->data.format_capacity_response.block_size = swap_uint32(msdp->block_dev_info.blk_size) | formated_capactiy_descriptor_code;
- usbPrepareTransmit(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->data.format_capacity_response,
+ usbStartTransmitI(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->data.format_capacity_response,
sizeof(msdp->data.format_capacity_response));
- MSD_START_TRANSMIT(msdp);
-
/* wait for ISR */
return MSD_WAIT_MODE_BULK_IN;
}
@@ -591,11 +572,9 @@ static msd_wait_mode_t SCSICommandReadCapacity10(USBMassStorageDriver *msdp) {
msdp->data.read_capacity10_response.block_size = swap_uint32(msdp->block_dev_info.blk_size);
msdp->data.read_capacity10_response.last_block_addr = swap_uint32(msdp->block_dev_info.blk_num - 1);
- usbPrepareTransmit(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->data.read_capacity10_response,
+ usbStartTransmitI(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->data.read_capacity10_response,
sizeof(msdp->data.read_capacity10_response));
- MSD_START_TRANSMIT(msdp);
-
/* wait for ISR */
return MSD_WAIT_MODE_BULK_IN;
}
@@ -634,12 +613,11 @@ static void SCSIWriteTransferPingPong(USBMassStorageDriver *msdp,
&& cnt < dest_buffer->max_blocks_to_read; cnt++) {
msdp->transfer_thread_state = "RX-Prep";
- usbPrepareReceive(msdp->usbp, msdp->ms_ep_number,
+ usbStartReceiveI(msdp->usbp, msdp->ms_ep_number,
(uint8_t*)&dest_buffer->buf[cnt * BLOCK_SIZE_INCREMENT],
(msdp->block_dev_info.blk_size));
msdp->transfer_thread_state = "RX";
- MSD_START_RECEIVED(msdp);
msdp->transfer_thread_state = "RX-Wait";
msdWaitForISR(msdp, FALSE, MSD_WAIT_MODE_BULK_OUT);
@@ -727,8 +705,8 @@ static msd_wait_mode_t SCSICommandStartReadWrite10(USBMassStorageDriver *msdp) {
const int empty_buffer_index = ((ping_pong_buffer_index + 1) % 2);
/*initiate another transfer in the other ping pong buffer*/
- //const bool_t queue_another_transfer = ((i + BLOCK_WRITE_ITTERATION_COUNT) < total_blocks);
- const bool_t queue_another_transfer = ((i + rw_ping_pong_buffer[done_buffer_index].num_blocks_to_write) < total_blocks);
+ //const bool queue_another_transfer = ((i + BLOCK_WRITE_ITTERATION_COUNT) < total_blocks);
+ const bool queue_another_transfer = ((i + rw_ping_pong_buffer[done_buffer_index].num_blocks_to_write) < total_blocks);
msd_debug_nest_print(msdp->chp, "D");
if (queue_another_transfer) {
@@ -754,7 +732,7 @@ static msd_wait_mode_t SCSICommandStartReadWrite10(USBMassStorageDriver *msdp) {
msd_debug_err_print(
msdp->chp, "\r\nCant write 0 blocks, this should not happen, halting\r\n");
chThdSleepMilliseconds(50);
- chSysHalt();
+ chSysHalt("MSD: Cant write 0 blocks");
}
/* now write the block to the block device */
@@ -763,7 +741,7 @@ static msd_wait_mode_t SCSICommandStartReadWrite10(USBMassStorageDriver *msdp) {
if (blkWrite(msdp->bbdp, rw_block_address,
(uint8_t*)rw_ping_pong_buffer[done_buffer_index].buf,
rw_ping_pong_buffer[done_buffer_index].num_blocks_to_write)
- == CH_FAILED) {
+ == HAL_FAILED) {
msd_debug_err_print(msdp->chp, "\r\nSD Block Write Error\r\n");
chThdSleepMilliseconds(50);
msdp->write_error_count++;
@@ -833,7 +811,7 @@ static msd_wait_mode_t SCSICommandStartReadWrite10(USBMassStorageDriver *msdp) {
read_success = FALSE;
for (retry_count = 0; retry_count < 3; retry_count++) {
if (blkRead(msdp->bbdp, rw_block_address, read_buffer[i % 2], 1)
- == CH_FAILED) {
+ == HAL_FAILED) {
msd_debug_err_print(msdp->chp, "\r\nSD Block Read Error: block # %u\r\n", rw_block_address);
msdp->read_error_count++;
} else {
@@ -875,11 +853,9 @@ static msd_wait_mode_t SCSICommandStartReadWrite10(USBMassStorageDriver *msdp) {
//while (usbGetTransmitStatusI(msdp->usbp, msdp->ms_ep_number)) {
//wait for the prior transmit to complete
//}
- usbPrepareTransmit(msdp->usbp, msdp->ms_ep_number, read_buffer[i % 2],
+ usbStartTransmitI(msdp->usbp, msdp->ms_ep_number, read_buffer[i % 2],
msdp->block_dev_info.blk_size);
- MSD_START_TRANSMIT(msdp);
-
if (i < (total_blocks - 1)) {
/* there is at least one more block to be read from device */
/* so read that while the USB transfer takes place */
@@ -887,7 +863,7 @@ static msd_wait_mode_t SCSICommandStartReadWrite10(USBMassStorageDriver *msdp) {
MSD_R_LED_ON();
for (retry_count = 0; retry_count < 3; retry_count++) {
if (blkRead(msdp->bbdp, rw_block_address, read_buffer[(i+1) % 2], 1)
- == CH_FAILED) {
+ == HAL_FAILED) {
msd_debug_err_print(msdp->chp, "\r\nSD Block Read Error 2: block # %u\r\n", rw_block_address);
msdp->read_error_count++;
@@ -984,20 +960,16 @@ static msd_wait_mode_t SCSICommandModeSense6(USBMassStorageDriver *msdp) {
msdp->data.mode_sense6_response.device_specifc_paramters |= (1<<7);
}
- usbPrepareTransmit(msdp->usbp, msdp->ms_ep_number, (uint8_t*)&msdp->data.mode_sense6_response, 4);
-
- MSD_START_TRANSMIT(msdp);
+ usbStartTransmitI(msdp->usbp, msdp->ms_ep_number, (uint8_t*)&msdp->data.mode_sense6_response, 4);
/* wait for ISR */
return MSD_WAIT_MODE_BULK_IN;
}
static msd_wait_mode_t msdWaitForCommandBlock(USBMassStorageDriver *msdp) {
- usbPrepareReceive(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->cbw,
+ usbStartReceiveI(msdp->usbp, msdp->ms_ep_number, (uint8_t *)&msdp->cbw,
sizeof(msd_cbw_t));
- MSD_START_RECEIVED(msdp);
-
msdp->state = MSD_STATE_READ_CMD_BLOCK;
return(MSD_WAIT_MODE_BULK_OUT);/* wait for ISR */
@@ -1220,7 +1192,7 @@ static msd_wait_mode_t msdProcessCommandBlock(USBMassStorageDriver *msdp) {
msdp->scsi_command_state = "TX";
msd_debug_nest_print(msdp->chp, "I");
- usbPrepareTransmit(msdp->usbp, msdp->ms_ep_number, (uint8_t *)csw,
+ usbStartTransmitI(msdp->usbp, msdp->ms_ep_number, (uint8_t *)csw,
sizeof(msd_csw_t));
chSysLock();
@@ -1228,7 +1200,6 @@ static msd_wait_mode_t msdProcessCommandBlock(USBMassStorageDriver *msdp) {
msdWaitForCommandBlock(msdp);
msdp->bulk_in_interupt_flag = false;
- usbStartTransmitI(msdp->usbp, msdp->ms_ep_number);
chSysUnlock();
msd_debug_nest_print(msdp->chp, "i");
@@ -1259,16 +1230,16 @@ static msd_wait_mode_t msdProcessCommandBlock(USBMassStorageDriver *msdp) {
*
* @special
*/
-static msg_t MassStorageUSBTransferThd(void *arg) {
+THD_FUNCTION(MassStorageUSBTransferThd, arg) {
USBMassStorageDriver *msdp = (USBMassStorageDriver *)arg;
chRegSetThreadName("MSD-Transfer");
- while ( !chThdShouldTerminate() ) {
+ while ( !chThdShouldTerminateX() ) {
if (msdp->suspend_threads_callback != NULL && msdp->suspend_threads_callback()) {
/* Suspend the thread for power savings mode */
chSysLock();
- chSchGoSleepS(THD_STATE_SUSPENDED);
+ chSchGoSleepS(CH_STATE_SUSPENDED);
chSysUnlock();
}
@@ -1284,12 +1255,11 @@ static msg_t MassStorageUSBTransferThd(void *arg) {
chBSemWaitTimeout(&msdp->usb_transfer_thread_bsem, MS2ST(1));
}
- return (0);
}
-static msg_t MassStorageThd(void *arg) {
+THD_FUNCTION(MassStorageThd, arg) {
USBMassStorageDriver *msdp = (USBMassStorageDriver *)arg;
chRegSetThreadName("MSD");
@@ -1300,13 +1270,13 @@ static msg_t MassStorageThd(void *arg) {
msdWaitForISR(msdp, FALSE, MSD_WAIT_MODE_NONE);
msd_debug_print(msdp->chp, "y");
- while ( !chThdShouldTerminate() ) {
+ while ( !chThdShouldTerminateX() ) {
#if 0
if( msdp->suspend_threads_callback != NULL && msdp->suspend_threads_callback() ) {
/* Suspend the thread for power savings mode */
chSysLock();
- chSchGoSleepS(THD_STATE_SUSPENDED);
+ chSchGoSleepS(CH_STATE_SUSPENDED);
chSysUnlock();
}
#endif
@@ -1323,7 +1293,7 @@ static msg_t MassStorageThd(void *arg) {
msdSetDefaultSenseKey(msdp);
}
- bool_t enable_msd = true;
+ bool enable_msd = true;
if (msdp->enable_msd_callback != NULL) {
enable_msd = msdp->enable_msd_callback();
}
@@ -1367,7 +1337,6 @@ static msg_t MassStorageThd(void *arg) {
usbStop(msdp->usbp);
chThdExit(0);
}
- return 0;
}
}
@@ -1402,7 +1371,6 @@ static msg_t MassStorageThd(void *arg) {
}
}
- return 0;
}
diff --git a/firmware/hw_layer/mass_storage/usb_msd.h b/firmware/hw_layer/mass_storage/usb_msd.h
index d4466b0842..049391fd9e 100644
--- a/firmware/hw_layer/mass_storage/usb_msd.h
+++ b/firmware/hw_layer/mass_storage/usb_msd.h
@@ -30,6 +30,17 @@
#if HAL_USE_MASS_STORAGE_USB || defined(__DOXYGEN__)
+#ifndef PACK_STRUCT_BEGIN
+#define PACK_STRUCT_BEGIN
+#endif
+
+#ifndef PACK_STRUCT_STRUCT
+#define PACK_STRUCT_STRUCT
+#endif
+
+#ifndef PACK_STRUCT_END
+#define PACK_STRUCT_END
+#endif
#if 0
#define MSD_RW_LED_ON() palSetPad(GPIOI, GPIOI_TRI_LED_BLUE)
@@ -216,29 +227,29 @@ struct USBMassStorageDriver {
/* Driver Setup Data */
USBDriver *usbp;
BaseBlockDevice *bbdp;
- EventSource evt_connected;
- EventSource evt_ejected;
+ event_source_t evt_connected;
+ event_source_t evt_ejected;
BlockDeviceInfo block_dev_info;
bool block_dev_info_valid_flag;
usb_msd_driver_state_t driver_state;
usbep_t ms_ep_number;
uint16_t msd_interface_number;
- bool_t (*enable_msd_callback)(void);
- bool_t (*suspend_threads_callback)(void);
+ bool (*enable_msd_callback)(void);
+ bool (*suspend_threads_callback)(void);
/* Externally modifiable settings */
- bool_t enable_media_removial;
- bool_t disable_usb_bus_disconnect_on_eject;
+ bool enable_media_removial;
+ bool disable_usb_bus_disconnect_on_eject;
BaseSequentialStream *chp; /*For debug logging*/
/*Internal data for operation of the driver */
- BinarySemaphore bsem;
- BinarySemaphore usb_transfer_thread_bsem;
- BinarySemaphore mass_sorage_thd_bsem;
+ binary_semaphore_t bsem;
+ binary_semaphore_t usb_transfer_thread_bsem;
+ binary_semaphore_t mass_sorage_thd_bsem;
volatile uint32_t trigger_transfer_index;
- volatile bool_t bulk_in_interupt_flag;
- volatile bool_t bulk_out_interupt_flag;
+ volatile bool bulk_in_interupt_flag;
+ volatile bool bulk_out_interupt_flag;
struct {
scsi_read_format_capacity_response_t format_capacity_response;
@@ -253,11 +264,11 @@ struct USBMassStorageDriver {
msd_csw_t csw;
scsi_sense_response_t sense;
- volatile bool_t reconfigured_or_reset_event;
+ volatile bool reconfigured_or_reset_event;
- bool_t command_succeeded_flag;
- bool_t stall_in_endpoint;
- bool_t stall_out_endpoint;
+ bool command_succeeded_flag;
+ bool stall_in_endpoint;
+ bool stall_out_endpoint;
/*Debugging Information*/
@@ -271,11 +282,11 @@ struct USBMassStorageDriver {
volatile uint8_t last_bad_scsi_command;
/* Externally readable values */
- volatile bool_t debug_enable_msd;
+ volatile bool debug_enable_msd;
volatile msd_wait_mode_t debug_wait_for_isr;
- WORKING_AREA(waMassStorage, MSD_THREAD_STACK_SIZE);
- WORKING_AREA(waMassStorageUSBTransfer, MSD_THREAD_STACK_SIZE);
+ THD_WORKING_AREA(waMassStorage, MSD_THREAD_STACK_SIZE);
+ THD_WORKING_AREA(waMassStorageUSBTransfer, MSD_THREAD_STACK_SIZE);
};
@@ -287,8 +298,8 @@ usb_msd_driver_state_t msdStart(USBMassStorageDriver *msdp);
usb_msd_driver_state_t msdStop(USBMassStorageDriver *msdp);
void msdBulkInCallbackComplete(USBDriver *usbp, usbep_t ep);
void msdBulkOutCallbackComplete(USBDriver *usbp, usbep_t ep);
-bool_t msdRequestsHook(USBDriver *usbp);
-bool_t msdRequestsHook2(USBDriver *usbp, USBMassStorageDriver *msdp);
+bool msdRequestsHook(USBDriver *usbp);
+bool msdRequestsHook2(USBDriver *usbp, USBMassStorageDriver *msdp);
const char* usb_msd_driver_state_t_to_str(const usb_msd_driver_state_t driver_state);
#ifdef __cplusplus
}
diff --git a/firmware/hw_layer/mass_storage/usb_msd_cfg.c b/firmware/hw_layer/mass_storage/usb_msd_cfg.c
index 56b76ff278..d5927a546c 100644
--- a/firmware/hw_layer/mass_storage/usb_msd_cfg.c
+++ b/firmware/hw_layer/mass_storage/usb_msd_cfg.c
@@ -201,7 +201,7 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
case USB_EVENT_ADDRESS:
return;
case USB_EVENT_CONFIGURED:
- chSysLockFromIsr();
+ chSysLockFromISR();
msdp->reconfigured_or_reset_event = TRUE;
usbInitEndpointI(usbp, msdp->ms_ep_number, &epDataConfig);
/* Kick-start the thread */
@@ -209,7 +209,7 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
/* signal that the device is connected */
chEvtBroadcastI(&msdp->evt_connected);
- chSysUnlockFromIsr();
+ chSysUnlockFromISR();
return;
case USB_EVENT_SUSPEND:
diff --git a/firmware/hw_layer/mmc_card.cpp b/firmware/hw_layer/mmc_card.cpp
index d40e2f3ffb..2f164ee193 100644
--- a/firmware/hw_layer/mmc_card.cpp
+++ b/firmware/hw_layer/mmc_card.cpp
@@ -328,7 +328,7 @@ static void MMCumount(void) {
f_sync(&FDLogFile); // sync ALL
mmcDisconnect(&MMCD1); // Brings the driver in a state safe for card removal.
mmcStop(&MMCD1); // Disables the MMC peripheral.
- f_mount(0, NULL); // FATFS: Unregister work area prior to discard it
+ f_mount(NULL, 0, 0); // FATFS: Unregister work area prior to discard it
memset(&FDLogFile, 0, sizeof(FIL)); // clear FDLogFile
fs_ready = false; // status = false
scheduleMsg(&logger, "MMC/SD card removed");
@@ -350,7 +350,7 @@ static void MMCmount(void) {
// Performs the initialization procedure on the inserted card.
lockSpi(SPI_NONE);
sdStatus = SD_STATE_CONNECTING;
- if (mmcConnect(&MMCD1) != CH_SUCCESS) {
+ if (mmcConnect(&MMCD1) != HAL_SUCCESS) {
sdStatus = SD_STATE_NOT_CONNECTED;
warning(CUSTOM_OBD_MMC_ERROR, "Can't connect or mount MMC/SD");
unlockSpi();
@@ -379,7 +379,7 @@ static void MMCmount(void) {
unlockSpi();
// if Ok - mount FS now
memset(&MMC_FS, 0, sizeof(FATFS));
- if (f_mount(0, &MMC_FS) == FR_OK) {
+ if (f_mount(&MMC_FS, 0, 0) == FR_OK) {
sdStatus = SD_STATE_MOUNTED;
incLogFileName();
createLogFile();
diff --git a/firmware/hw_layer/rtc_helper.cpp b/firmware/hw_layer/rtc_helper.cpp
index ac694c1db1..8e0d94f1ef 100644
--- a/firmware/hw_layer/rtc_helper.cpp
+++ b/firmware/hw_layer/rtc_helper.cpp
@@ -13,25 +13,52 @@
#include "rtc_helper.h"
#if EFI_RTC || defined(__DOXYGEN__)
-#include "chrtclib.h"
+#include "rtc.h"
static LoggingWithStorage logger("RTC");
+static RTCDateTime timespec;
#endif /* EFI_RTC */
void date_set_tm(struct tm *timp) {
(void)timp;
#if EFI_RTC || defined(__DOXYGEN__)
- rtcSetTimeTm(&RTCD1, timp);
+ rtcConvertStructTmToDateTime(timp, 0, ×pec);
+ rtcSetTime(&RTCD1, ×pec);
#endif /* EFI_RTC */
}
void date_get_tm(struct tm *timp) {
- (void)timp;
#if EFI_RTC || defined(__DOXYGEN__)
- rtcGetTimeTm(&RTCD1, timp);
+ rtcGetTime(&RTCD1, ×pec);
+ rtcConvertDateTimeToStructTm(×pec, timp, NULL);
#endif /* EFI_RTC */
}
+static time_t GetTimeUnixSec(void) {
+#if EFI_RTC || defined(__DOXYGEN__)
+ struct tm tim;
+
+ rtcGetTime(&RTCD1, ×pec);
+ rtcConvertDateTimeToStructTm(×pec, &tim, NULL);
+ return mktime(&tim);
+#endif
+}
+
+static void SetTimeUnixSec(time_t unix_time) {
+#if EFI_RTC || defined(__DOXYGEN__)
+ struct tm tim;
+ struct tm *canary;
+
+ /* If the conversion is successful the function returns a pointer
+ to the object the result was written into.*/
+ canary = localtime_r(&unix_time, &tim);
+ osalDbgCheck(&tim == canary);
+
+ rtcConvertStructTmToDateTime(&tim, 0, ×pec);
+ rtcSetTime(&RTCD1, ×pec);
+#endif
+}
+
static void put2(int offset, char *lcd_str, int value) {
static char buff[_MAX_FILLER];
efiAssertVoid(value >=0 && value <100, "value");
@@ -49,7 +76,7 @@ bool dateToStringShort(char *lcd_str) {
#if EFI_RTC || defined(__DOXYGEN__)
strcpy(lcd_str, "0000_000000\0");
struct tm timp;
- rtcGetTimeTm(&RTCD1, &timp);
+ date_get_tm(&timp);
if (timp.tm_year < 116 || timp.tm_year > 130) {
// 2016 to 2030 is the valid range
lcd_str[0] = 0;
@@ -77,7 +104,7 @@ void dateToString(char *lcd_str) {
strcpy(lcd_str, "00/00 00:00:00\0");
struct tm timp;
- rtcGetTimeTm(&RTCD1, &timp); // get RTC date/time
+ date_get_tm(&timp); // get RTC date/time
put2(0, lcd_str, timp.tm_mon + 1);
put2(3, lcd_str, timp.tm_mday);
@@ -95,12 +122,12 @@ void printDateTime(void) {
static time_t unix_time;
struct tm timp;
- unix_time = rtcGetTimeUnixSec(&RTCD1);
+ unix_time = GetTimeUnixSec();
if (unix_time == -1) {
scheduleMsg(&logger, "incorrect time in RTC cell");
} else {
scheduleMsg(&logger, "%D - unix time", unix_time);
- rtcGetTimeTm(&RTCD1, &timp);
+ date_get_tm(&timp);
appendMsgPrefix(&logger);
appendPrintf(&logger, "Current RTC time in GMT is: %04u-%02u-%02u %02u:%02u:%02u", timp.tm_year + 1900, timp.tm_mon + 1, timp.tm_mday, timp.tm_hour,
@@ -114,7 +141,7 @@ void setDateTime(const char *strDate) {
if (strlen(strDate) > 0) {
time_t unix_time = atoi(strDate);
if (unix_time > 0) {
- rtcSetTimeUnixSec(&RTCD1, unix_time);
+ SetTimeUnixSec(unix_time);
printDateTime();
return;
}
@@ -125,7 +152,7 @@ void setDateTime(const char *strDate) {
void initRtc(void) {
#if EFI_RTC || defined(__DOXYGEN__)
- rtcGetTimeUnixSec(&RTCD1); // this would test RTC, see 'rtcWorks' variable, see #311
+ GetTimeUnixSec(); // this would test RTC, see 'rtcWorks' variable, see #311
printMsg(&logger, "initRtc()");
#endif /* EFI_RTC */
}
diff --git a/firmware/hw_layer/serial_over_usb/usbcfg.c b/firmware/hw_layer/serial_over_usb/usbcfg.c
index b13196f2c6..c712b0bce5 100644
--- a/firmware/hw_layer/serial_over_usb/usbcfg.c
+++ b/firmware/hw_layer/serial_over_usb/usbcfg.c
@@ -271,7 +271,7 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
case USB_EVENT_ADDRESS:
return;
case USB_EVENT_CONFIGURED:
- chSysLockFromIsr();
+ chSysLockFromISR();
/* Enables the endpoints specified into the configuration.
Note, this callback is invoked from an ISR so I-Class functions
@@ -282,7 +282,9 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
/* Resetting the state of the CDC subsystem.*/
sduConfigureHookI(&SDU1);
- chSysUnlockFromIsr();
+ chSysUnlockFromISR();
+ return;
+ case USB_EVENT_UNCONFIGURED:
return;
case USB_EVENT_SUSPEND:
return;
diff --git a/firmware/hw_layer/stm32f4/mpu_util.cpp b/firmware/hw_layer/stm32f4/mpu_util.cpp
index eca12acc1f..b9600512cb 100644
--- a/firmware/hw_layer/stm32f4/mpu_util.cpp
+++ b/firmware/hw_layer/stm32f4/mpu_util.cpp
@@ -11,11 +11,12 @@
#include "engine.h"
#include "pin_repository.h"
#include "stm32f4xx_hal_flash.h"
+#include "rfiutil.h"
EXTERN_ENGINE;
extern "C" {
-int getRemainingStack(thread_t *otp);
+//int getRemainingStack(thread_t *otp);
void prvGetRegistersFromStack(uint32_t *pulFaultStackAddress);
}
@@ -26,12 +27,14 @@ extern uint32_t __main_stack_base__;
#if defined __GNUC__
// GCC version
+typedef struct port_intctx intctx_t;
+
int getRemainingStack(thread_t *otp) {
#if CH_DBG_ENABLE_STACK_CHECK
// this would dismiss coverity warning - see http://rusefi.com/forum/viewtopic.php?f=5&t=655
// coverity[uninit_use]
- register struct intctx *r13 asm ("r13");
+ register intctx_t *r13 asm ("r13");
otp->activeStack = r13;
int remainingStack;
@@ -57,9 +60,9 @@ int getRemainingStack(Thread *otp) {
#if CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
int remainingStack;
if (dbg_isr_cnt > 0) {
- remainingStack = (__get_SP() - sizeof(struct intctx)) - (int)&IRQSTACK$$Base;
+ remainingStack = (__get_SP() - sizeof(intctx_t)) - (int)&IRQSTACK$$Base;
} else {
- remainingStack = (__get_SP() - sizeof(struct intctx)) - (int)otp->p_stklimit;
+ remainingStack = (__get_SP() - sizeof(intctx_t)) - (int)otp->p_stklimit;
}
otp->remainingStack = remainingStack;
return remainingStack;
@@ -74,7 +77,7 @@ int getRemainingStack(Thread *otp) {
void baseHardwareInit(void) {
// looks like this holds a random value on start? Let's set a nice clean zero
- DWT_CYCCNT = 0;
+ DWT->CYCCNT = 0;
BOR_Set(BOR_Level_1); // one step above default value
}
diff --git a/firmware/hw_layer/trigger_input.cpp b/firmware/hw_layer/trigger_input.cpp
index 305fd9175c..47b53b49d8 100644
--- a/firmware/hw_layer/trigger_input.cpp
+++ b/firmware/hw_layer/trigger_input.cpp
@@ -111,7 +111,7 @@ static ICUDriver *turnOnTriggerInputPin(const char *msg, brain_pin_e hwPin, ICUC
efiIcuStart(driver, icucfg);
if (driver->state == ICU_READY) {
- icuEnable(driver);
+ icuEnableNotifications(driver);
} else {
// we would be here for example if same pin is used for multiple input capture purposes
firmwareError(CUSTOM_ERR_ICU_STATE, "ICU unexpected state [%s]", hwPortname(hwPin));
@@ -123,7 +123,7 @@ static ICUDriver *turnOnTriggerInputPin(const char *msg, brain_pin_e hwPin, ICUC
static void turnOffTriggerInputPin(brain_pin_e hwPin) {
ICUDriver *driver = getInputCaptureDriver("trigger_off", hwPin);
if (driver != NULL) {
- icuDisable(driver);
+ icuDisableNotificationsI(driver);
icuStop(driver);
scheduleMsg(logger, "turnOffTriggerInputPin %s", hwPortname(hwPin));
unmarkPin(hwPin);
diff --git a/firmware/util/datalogging.cpp b/firmware/util/datalogging.cpp
index 08e856daa7..ecc2a84ced 100644
--- a/firmware/util/datalogging.cpp
+++ b/firmware/util/datalogging.cpp
@@ -105,7 +105,7 @@ void appendFast(Logging *logging, const char *text) {
// todo: look into chsnprintf once on Chibios 3
static void vappendPrintfI(Logging *logging, const char *fmt, va_list arg) {
intermediateLoggingBuffer.eos = 0; // reset
- efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#1b");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 128, "lowstck#1b");
chvprintf((BaseSequentialStream *) &intermediateLoggingBuffer, fmt, arg);
intermediateLoggingBuffer.buffer[intermediateLoggingBuffer.eos] = 0; // need to terminate explicitly
append(logging, (char *) intermediateLoggingBufferData);
@@ -115,7 +115,7 @@ static void vappendPrintfI(Logging *logging, const char *fmt, va_list arg) {
* this method acquires system lock to guard the shared intermediateLoggingBuffer memory stream
*/
void vappendPrintf(Logging *logging, const char *fmt, va_list arg) {
- efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#5b");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 128, "lowstck#5b");
if (!intermediateLoggingBufferInited) {
firmwareError(CUSTOM_ERR_6532, "intermediateLoggingBufferInited not inited!");
return;
@@ -128,7 +128,7 @@ void vappendPrintf(Logging *logging, const char *fmt, va_list arg) {
}
void appendPrintf(Logging *logging, const char *fmt, ...) {
- efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#4");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 128, "lowstck#4");
va_list ap;
va_start(ap, fmt);
vappendPrintf(logging, fmt, ap);
@@ -253,7 +253,7 @@ void resetLogging(Logging *logging) {
* This method should only be invoked on main thread because only the main thread can write to the console
*/
void printMsg(Logging *logger, const char *fmt, ...) {
- efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#5o");
+ efiAssertVoid(getRemainingStack(chThdGetSelfX()) > 128, "lowstck#5o");
// resetLogging(logging); // I guess 'reset' is not needed here?
appendMsgPrefix(logger);
diff --git a/firmware/util/efilib2.h b/firmware/util/efilib2.h
index 19cd344a1e..566f191fb9 100644
--- a/firmware/util/efilib2.h
+++ b/firmware/util/efilib2.h
@@ -34,7 +34,7 @@ class Overflow64Counter
#include "main.h"
#if (EFI_PROD_CODE || EFI_SIMULATOR)
- #define GET_TIMESTAMP() hal_lld_get_counter_value()
+ #define GET_TIMESTAMP() port_rt_get_counter_value()
#else
#define GET_TIMESTAMP() 0
#endif
diff --git a/firmware/util/rfiutil.c b/firmware/util/rfiutil.c
index f6e725592b..cae4d239d6 100644
--- a/firmware/util/rfiutil.c
+++ b/firmware/util/rfiutil.c
@@ -76,3 +76,5 @@ void chVTSetAny(virtual_timer_t *vtp, systime_t time, vtfunc_t vtfunc, void *par
#endif
+cnt_t dbg_lock_cnt;
+cnt_t dbg_isr_cnt;
\ No newline at end of file
diff --git a/firmware/util/rfiutil.h b/firmware/util/rfiutil.h
index 8f5ee56f12..4b8eaf98ea 100644
--- a/firmware/util/rfiutil.h
+++ b/firmware/util/rfiutil.h
@@ -15,6 +15,8 @@
#include "histogram.h"
+extern cnt_t dbg_lock_cnt;
+extern cnt_t dbg_isr_cnt;
#define isLocked() (dbg_lock_cnt > 0)
/**