diff --git a/Makefile b/Makefile index 20c540bebf..ef918702a0 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,9 @@ EXST ?= no # compile for target loaded into RAM RAM_BASED ?= no +# reserve space for custom defaults +CUSTOM_DEFAULTS_EXTENDED ?= no + # Debugger optons: # empty - ordinary build with all optimizations enabled # RELWITHDEBINFO - ordinary build with debug symbols and all optimizations enabled @@ -123,7 +126,8 @@ FATFS_SRC = $(notdir $(wildcard $(FATFS_DIR)/*.c)) CSOURCES := $(shell find $(SRC_DIR) -name '*.c') -LD_FLAGS := +LD_FLAGS := +EXTRA_LD_FLAGS := # # Default Tool options - can be overridden in {mcu}.mk files. @@ -185,6 +189,11 @@ else .DEFAULT_GOAL := hex endif +ifeq ($(CUSTOM_DEFAULTS_EXTENDED),yes) +TARGET_FLAGS += -DUSE_CUSTOM_DEFAULTS= +EXTRA_LD_FLAGS += -Wl,--defsym=USE_CUSTOM_DEFAULTS_EXTENDED=1 +endif + INCLUDE_DIRS := $(INCLUDE_DIRS) \ $(ROOT)/lib/main/MAVLink @@ -266,7 +275,8 @@ LD_FLAGS = -lm \ -Wl,--cref \ -Wl,--no-wchar-size-warning \ -Wl,--print-memory-usage \ - -T$(LD_SCRIPT) + -T$(LD_SCRIPT) \ + $(EXTRA_LD_FLAGS) endif ############################################################################### diff --git a/src/link/stm32_flash_f405.ld b/src/link/stm32_flash_f405.ld index 429262f7f4..d1b9fa652c 100644 --- a/src/link/stm32_flash_f405.ld +++ b/src/link/stm32_flash_f405.ld @@ -9,9 +9,6 @@ ***************************************************************************** */ -/* Entry Point */ -ENTRY(Reset_Handler) - /* 0x08000000 to 0x080FFFFF 1024K full flash, 0x08000000 to 0x08003FFF 16K isr vector, startup code, @@ -22,9 +19,11 @@ ENTRY(Reset_Handler) /* Specify the memory areas */ MEMORY { - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 10K + FLASH_CUSTOM_DEFAULTS (r) : ORIGIN = 0x08002800, LENGTH = 6K FLASH_CONFIG (r) : ORIGIN = 0x08004000, LENGTH = 16K - FLASH1 (rx) : ORIGIN = 0x08008000, LENGTH = 992K + FLASH1 (rx) : ORIGIN = 0x08008000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS) ? 976K : 992K + FLASH_CUSTOM_DEFAULTS_EXTENDED (r): ORIGIN = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 0x080FC000 : 0x08100000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 16K : 0K SYSTEM_MEMORY (rx): ORIGIN = 0x1FFF0000, LENGTH = 29K diff --git a/src/link/stm32_flash_f405_opbl.ld b/src/link/stm32_flash_f405_opbl.ld index 28e63578b0..aabc0de09f 100644 --- a/src/link/stm32_flash_f405_opbl.ld +++ b/src/link/stm32_flash_f405_opbl.ld @@ -9,9 +9,6 @@ ***************************************************************************** */ -/* Entry Point */ -ENTRY(Reset_Handler) - /* 0x08000000 to 0x080FFFFF 1024K full flash, 0x08000000 to 0x08003FFF 16K OPBL, diff --git a/src/link/stm32_flash_f411.ld b/src/link/stm32_flash_f411.ld index c36df21513..43d4cd8163 100644 --- a/src/link/stm32_flash_f411.ld +++ b/src/link/stm32_flash_f411.ld @@ -9,12 +9,10 @@ ***************************************************************************** */ -/* Entry Point */ -ENTRY(Reset_Handler) - /* 0x08000000 to 0x0807FFFF 512K full flash, 0x08000000 to 0x08003FFF 16K isr vector, startup code, + 0x08004000 to 0x08007FFF 16K config, // FLASH_Sector_1 0x08008000 to 0x0807FFFF 480K firmware, */ @@ -22,9 +20,11 @@ ENTRY(Reset_Handler) /* Specify the memory areas */ MEMORY { - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 10K + FLASH_CUSTOM_DEFAULTS (r) : ORIGIN = 0x08002800, LENGTH = 6K FLASH_CONFIG (r) : ORIGIN = 0x08004000, LENGTH = 16K - FLASH1 (rx) : ORIGIN = 0x08008000, LENGTH = 480K + FLASH1 (rx) : ORIGIN = 0x08008000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS) ? 464K : 480K + FLASH_CUSTOM_DEFAULTS_EXTENDED (r): ORIGIN = DEFINED(USE_CUSTOM_DEFAULTS) ? 0x0807C000 : 0x08080000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 16K : 0K SYSTEM_MEMORY (rx): ORIGIN = 0x1FFF0000, LENGTH = 29K diff --git a/src/link/stm32_flash_f411_opbl.ld b/src/link/stm32_flash_f411_opbl.ld index 5825629d6e..61cf5a1a8b 100644 --- a/src/link/stm32_flash_f411_opbl.ld +++ b/src/link/stm32_flash_f411_opbl.ld @@ -9,9 +9,6 @@ ***************************************************************************** */ -/* Entry Point */ -ENTRY(Reset_Handler) - /* 0x08000000 to 0x0807FFFF 512K full flash, 0x08000000 to 0x08003FFF 16K OPBL, diff --git a/src/link/stm32_flash_f446.ld b/src/link/stm32_flash_f446.ld index 7b642fee5d..d40a39042b 100644 --- a/src/link/stm32_flash_f446.ld +++ b/src/link/stm32_flash_f446.ld @@ -9,9 +9,6 @@ ***************************************************************************** */ -/* Entry Point */ -ENTRY(Reset_Handler) - /* 0x08000000 to 0x0807FFFF 512K full flash, 0x08000000 to 0x08003FFF 16K isr vector, startup code, @@ -22,7 +19,8 @@ ENTRY(Reset_Handler) /* Specify the memory areas */ MEMORY { - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 10K + FLASH_CUSTOM_DEFAULTS (r) : ORIGIN = 0x08002800, LENGTH = 6K FLASH_CONFIG (r) : ORIGIN = 0x08004000, LENGTH = 16K FLASH1 (rx) : ORIGIN = 0x08008000, LENGTH = 480K diff --git a/src/link/stm32_flash_f722.ld b/src/link/stm32_flash_f722.ld index b9e3041b99..717966001e 100644 --- a/src/link/stm32_flash_f722.ld +++ b/src/link/stm32_flash_f722.ld @@ -9,9 +9,6 @@ ***************************************************************************** */ -/* Entry Point */ -ENTRY(Reset_Handler) - /* 0x08000000 to 0x0807FFFF 512K full flash 0x08000000 to 0x08003FFF 16K ISR vector @@ -29,9 +26,11 @@ MEMORY ITCM_FLASH_CONFIG (r) : ORIGIN = 0x00204000, LENGTH = 16K ITCM_FLASH1 (rx) : ORIGIN = 0x00208000, LENGTH = 480K - AXIM_FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K + AXIM_FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 10K + AXIM_FLASH_CUSTOM_DEFAULTS (r) : ORIGIN = 0x08002800, LENGTH = 6K AXIM_FLASH_CONFIG (r) : ORIGIN = 0x08004000, LENGTH = 16K - AXIM_FLASH1 (rx) : ORIGIN = 0x08008000, LENGTH = 480K + AXIM_FLASH1 (rx) : ORIGIN = 0x08008000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 464K : 480K + AXIM_FLASH_CUSTOM_DEFAULTS_EXTENDED (r) : ORIGIN = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 0x0807C000 : 0x08080000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 16K : 0K DTCM_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K SRAM1 (rwx) : ORIGIN = 0x20010000, LENGTH = 176K @@ -40,8 +39,10 @@ MEMORY } REGION_ALIAS("FLASH", AXIM_FLASH) +REGION_ALIAS("FLASH_CUSTOM_DEFAULTS", AXIM_FLASH_CUSTOM_DEFAULTS) REGION_ALIAS("FLASH_CONFIG", AXIM_FLASH_CONFIG) REGION_ALIAS("FLASH1", AXIM_FLASH1) +REGION_ALIAS("FLASH_CUSTOM_DEFAULTS_EXTENDED", AXIM_FLASH_CUSTOM_DEFAULTS_EXTENDED) REGION_ALIAS("STACKRAM", DTCM_RAM) REGION_ALIAS("FASTRAM", DTCM_RAM) diff --git a/src/link/stm32_flash_f74x.ld b/src/link/stm32_flash_f74x.ld index 4b605fe9d6..0ed73b0d95 100644 --- a/src/link/stm32_flash_f74x.ld +++ b/src/link/stm32_flash_f74x.ld @@ -9,9 +9,6 @@ ***************************************************************************** */ -/* Entry Point */ -ENTRY(Reset_Handler) - /* 0x00000000 to 0x00003FFF 16K TCM RAM, @@ -31,9 +28,11 @@ MEMORY ITCM_FLASH_CONFIG (r) : ORIGIN = 0x00208000, LENGTH = 32K ITCM_FLASH1 (rx) : ORIGIN = 0x00210000, LENGTH = 960K - AXIM_FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32K + AXIM_FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 10K + AXIM_FLASH_CUSTOM_DEFAULTS (r) : ORIGIN = 0x08002800, LENGTH = 22K AXIM_FLASH_CONFIG (r) : ORIGIN = 0x08008000, LENGTH = 32K - AXIM_FLASH1 (rx) : ORIGIN = 0x08010000, LENGTH = 960K + AXIM_FLASH1 (rx) : ORIGIN = 0x08010000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS) ? 928K : 960K + AXIM_FLASH_CUSTOM_DEFAULTS_EXTENDED (r) : ORIGIN = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 0x080F8000 : 0x08100000, LENGTH = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? 32K : 0K DTCM_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K SRAM1 (rwx) : ORIGIN = 0x20010000, LENGTH = 240K @@ -42,8 +41,10 @@ MEMORY } REGION_ALIAS("FLASH", ITCM_FLASH) +REGION_ALIAS("FLASH_CUSTOM_DEFAULTS", AXIM_FLASH_CUSTOM_DEFAULTS) REGION_ALIAS("FLASH_CONFIG", AXIM_FLASH_CONFIG) REGION_ALIAS("FLASH1", ITCM_FLASH1) +REGION_ALIAS("FLASH_CUSTOM_DEFAULTS_EXTENDED", AXIM_FLASH_CUSTOM_DEFAULTS_EXTENDED) REGION_ALIAS("STACKRAM", DTCM_RAM) REGION_ALIAS("FASTRAM", DTCM_RAM) diff --git a/src/link/stm32_flash_f765.ld b/src/link/stm32_flash_f765.ld index f5faee1612..3515f37628 100644 --- a/src/link/stm32_flash_f765.ld +++ b/src/link/stm32_flash_f765.ld @@ -9,9 +9,6 @@ ***************************************************************************** */ -/* Entry Point */ -ENTRY(Reset_Handler) - /* 0x00000000 to 0x00003FFF 16K TCM RAM, @@ -30,7 +27,8 @@ MEMORY ITCM_FLASH_CONFIG (r) : ORIGIN = 0x00208000, LENGTH = 32K ITCM_FLASH1 (rx) : ORIGIN = 0x00210000, LENGTH = 1984K - AXIM_FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32K + AXIM_FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 10K + AXIM_FLASH_CUSTOM_DEFAULTS (r) : ORIGIN = 0x08002800, LENGTH = 22K AXIM_FLASH_CONFIG (r) : ORIGIN = 0x08008000, LENGTH = 32K AXIM_FLASH1 (rx) : ORIGIN = 0x08010000, LENGTH = 1984K @@ -41,6 +39,7 @@ MEMORY } REGION_ALIAS("FLASH", AXIM_FLASH) +REGION_ALIAS("FLASH_CUSTOM_DEFAULTS", AXIM_FLASH_CUSTOM_DEFAULTS) REGION_ALIAS("FLASH_CONFIG", AXIM_FLASH_CONFIG) REGION_ALIAS("FLASH1", AXIM_FLASH1) diff --git a/src/link/stm32_flash_f7_split.ld b/src/link/stm32_flash_f7_split.ld index f6312646d6..8693c50ed5 100644 --- a/src/link/stm32_flash_f7_split.ld +++ b/src/link/stm32_flash_f7_split.ld @@ -34,6 +34,13 @@ SECTIONS . = ALIGN(4); } >FLASH AT >AXIM_FLASH + /* Storage for the address for the configuration section so we can grab it out of the hex file */ + .custom_defaults : + { + . = ALIGN(4); + *(.custom_defaults_address) + } >FLASH1 AT >AXIM_FLASH1 + /* The program code and other data goes into FLASH */ .text : { @@ -92,6 +99,19 @@ SECTIONS PROVIDE_HIDDEN (__pg_resetdata_end = .); } >FLASH AT >AXIM_FLASH + /* Storage for the address for the configuration section so we can grab it out of the hex file */ + .custom_defaults : + { + . = ALIGN(4); + KEEP (*(.custom_defaults_address)) + . = ALIGN(4); + __custom_defaults_internal_start = .; + *(.custom_defaults); + } >FLASH_CUSTOM_DEFAULTS + + PROVIDE_HIDDEN (__custom_defaults_start = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) : __custom_defaults_internal_start); + PROVIDE_HIDDEN (__custom_defaults_end = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) + LENGTH(FLASH_CUSTOM_DEFAULTS_EXTENDED) : ORIGIN(FLASH_CUSTOM_DEFAULTS) + LENGTH(FLASH_CUSTOM_DEFAULTS)); + /* used by the startup to initialize data */ _sidata = LOADADDR(.data); diff --git a/src/link/stm32_flash_split.ld b/src/link/stm32_flash_split.ld index 4659c3232c..54221b9548 100644 --- a/src/link/stm32_flash_split.ld +++ b/src/link/stm32_flash_split.ld @@ -116,6 +116,19 @@ SECTIONS PROVIDE_HIDDEN (__pg_resetdata_end = .); } >FLASH + /* Storage for the address for the configuration section so we can grab it out of the hex file */ + .custom_defaults : + { + . = ALIGN(4); + KEEP (*(.custom_defaults_address)) + . = ALIGN(4); + __custom_defaults_internal_start = .; + *(.custom_defaults); + } >FLASH_CUSTOM_DEFAULTS + + PROVIDE_HIDDEN (__custom_defaults_start = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) : __custom_defaults_internal_start); + PROVIDE_HIDDEN (__custom_defaults_end = DEFINED(USE_CUSTOM_DEFAULTS_EXTENDED) ? ORIGIN(FLASH_CUSTOM_DEFAULTS_EXTENDED) + LENGTH(FLASH_CUSTOM_DEFAULTS_EXTENDED) : ORIGIN(FLASH_CUSTOM_DEFAULTS) + LENGTH(FLASH_CUSTOM_DEFAULTS)); + /* used by the startup to initialize data */ _sidata = LOADADDR(.data); diff --git a/src/main/cli/cli.c b/src/main/cli/cli.c index 2e7a153831..9c77c46ccc 100644 --- a/src/main/cli/cli.c +++ b/src/main/cli/cli.c @@ -30,7 +30,7 @@ // FIXME remove this for targets that don't need a CLI. Perhaps use a no-op macro when USE_CLI is not enabled // signal that we're in cli mode -uint8_t cliMode = 0; +bool cliMode = false; #ifdef USE_CLI @@ -172,14 +172,7 @@ uint8_t cliMode = 0; #include "cli.h" -typedef struct serialPassthroughPort_e { - int id; - uint32_t baud; - unsigned mode; - serialPort_t *port; -} serialPassthroughPort_t; - -static serialPort_t *cliPort; +static serialPort_t *cliPort = NULL; #ifdef STM32F1 #define CLI_IN_BUFFER_SIZE 128 @@ -189,7 +182,7 @@ static serialPort_t *cliPort; #endif #define CLI_OUT_BUFFER_SIZE 64 -static bufWriter_t *cliWriter; +static bufWriter_t *cliWriter = NULL; static uint8_t cliWriteBuffer[sizeof(*cliWriter) + CLI_OUT_BUFFER_SIZE]; static char cliBuffer[CLI_IN_BUFFER_SIZE]; @@ -219,6 +212,24 @@ static bool signatureUpdated = false; static const char* const emptyName = "-"; static const char* const emptyString = ""; +#if !defined(USE_CUSTOM_DEFAULTS) +#define CUSTOM_DEFAULTS_START ((char*)0) +#define CUSTOM_DEFAULTS_END ((char *)0) +#else +extern char __custom_defaults_start; +extern char __custom_defaults_end; +#define CUSTOM_DEFAULTS_START (&__custom_defaults_start) +#define CUSTOM_DEFAULTS_END (&__custom_defaults_end) + +static bool processingCustomDefaults = false; +static char cliBufferTemp[CLI_IN_BUFFER_SIZE]; +#endif + +#if defined(USE_CUSTOM_DEFAULTS_ADDRESS) +static char __attribute__ ((section(".custom_defaults_address"))) *customDefaultsStart = CUSTOM_DEFAULTS_START; +static char __attribute__ ((section(".custom_defaults_address"))) *customDefaultsEnd = CUSTOM_DEFAULTS_END; +#endif + #ifndef USE_QUAD_MIXER_ONLY // sync this with mixerMode_e static const char * const mixerNames[] = { @@ -288,6 +299,13 @@ typedef enum { REBOOT_TARGET_BOOTLOADER_FLASH, } rebootTarget_e; +typedef struct serialPassthroughPort_e { + int id; + uint32_t baud; + unsigned mode; + serialPort_t *port; +} serialPassthroughPort_t; + static void backupPgConfig(const pgRegistry_t *pg) { memcpy(pg->copy, pg->address, pg->size); @@ -300,6 +318,10 @@ static void restorePgConfig(const pgRegistry_t *pg) static void backupConfigs(void) { + if (configIsInCopy) { + return; + } + // make copies of configs to do differencing PG_FOREACH(pg) { backupPgConfig(pg); @@ -310,6 +332,10 @@ static void backupConfigs(void) static void restoreConfigs(void) { + if (!configIsInCopy) { + return; + } + PG_FOREACH(pg) { restorePgConfig(pg); } @@ -317,19 +343,54 @@ static void restoreConfigs(void) configIsInCopy = false; } -static void backupAndResetConfigs(void) +#if defined(USE_RESOURCE_MGMT) || defined(USE_TIMER_MGMT) +static bool isReadingConfigFromCopy() +{ + return configIsInCopy; +} +#endif + +static bool isWritingConfigToCopy() +{ + return configIsInCopy +#if defined(USE_CUSTOM_DEFAULTS) + && !processingCustomDefaults +#endif + ; +} + +static void backupAndResetConfigs(const bool useCustomDefaults) { backupConfigs(); + // reset all configs to defaults to do differencing resetConfigs(); + +#if defined(USE_CUSTOM_DEFAULTS) + if (useCustomDefaults) { + cliProcessCustomDefaults(); + } +#else + UNUSED(useCustomDefaults); +#endif } +static void cliWriterFlush() +{ + if (cliWriter) { + bufWriterFlush(cliWriter); + } +} + + static void cliPrint(const char *str) { - while (*str) { - bufWriterAppend(cliWriter, *str++); + if (cliWriter) { + while (*str) { + bufWriterAppend(cliWriter, *str++); + } + cliWriterFlush(); } - bufWriterFlush(cliWriter); } static void cliPrintLinefeed(void) @@ -360,8 +421,10 @@ static void cliPutp(void *p, char ch) static void cliPrintfva(const char *format, va_list va) { - tfp_format(cliWriter, cliPutp, format, va); - bufWriterFlush(cliWriter); + if (cliWriter) { + tfp_format(cliWriter, cliPutp, format, va); + cliWriterFlush(); + } } static bool cliDumpPrintLinef(dumpFlags_t dumpMask, bool equalsDefault, const char *format, ...) @@ -380,7 +443,9 @@ static bool cliDumpPrintLinef(dumpFlags_t dumpMask, bool equalsDefault, const ch static void cliWrite(uint8_t ch) { - bufWriterAppend(cliWriter, ch); + if (cliWriter) { + bufWriterAppend(cliWriter, ch); + } } static bool cliDefaultPrintLinef(dumpFlags_t dumpMask, bool equalsDefault, const char *format, ...) @@ -647,22 +712,16 @@ static uint16_t getValueOffset(const clivalue_t *value) return 0; } -void *cliGetValuePointer(const clivalue_t *value) +STATIC_UNIT_TESTED void *cliGetValuePointer(const clivalue_t *value) { const pgRegistry_t* rec = pgFind(value->pgn); - if (configIsInCopy) { + if (isWritingConfigToCopy()) { return CONST_CAST(void *, rec->copy + getValueOffset(value)); } else { return CONST_CAST(void *, rec->address + getValueOffset(value)); } } -const void *cliGetDefaultPointer(const clivalue_t *value) -{ - const pgRegistry_t* rec = pgFind(value->pgn); - return rec->address + getValueOffset(value); -} - static const char *dumpPgValue(const clivalue_t *value, dumpFlags_t dumpMask, const char *headingStr) { const pgRegistry_t *pg = pgFind(value->pgn); @@ -698,7 +757,7 @@ static void dumpAllValues(uint16_t valueSection, dumpFlags_t dumpMask, const cha for (uint32_t i = 0; i < valueTableEntryCount; i++) { const clivalue_t *value = &valueTable[i]; - bufWriterFlush(cliWriter); + cliWriterFlush(); if ((value->type & VALUE_SECTION_MASK) == valueSection || ((valueSection == MASTER_VALUE) && (value->type & VALUE_SECTION_MASK) == HARDWARE_VALUE)) { headingStr = dumpPgValue(value, dumpMask, headingStr); } @@ -826,16 +885,25 @@ static void cliSetVar(const clivalue_t *var, const uint32_t value) #if defined(USE_RESOURCE_MGMT) && !defined(MINIMAL_CLI) static void cliRepeat(char ch, uint8_t len) { - for (int i = 0; i < len; i++) { - bufWriterAppend(cliWriter, ch); + if (cliWriter) { + for (int i = 0; i < len; i++) { + bufWriterAppend(cliWriter, ch); + } + cliPrintLinefeed(); } - cliPrintLinefeed(); } #endif static void cliPrompt(void) { - cliPrint("\r\n# "); +#if defined(USE_CUSTOM_DEFAULTS) && defined(DEBUG_CUSTOM_DEFAULTS) + if (processingCustomDefaults) { + cliPrint("\r\nd: #"); + } else +#endif + { + cliPrint("\r\n# "); + } } static void cliShowParseError(void) @@ -2352,7 +2420,7 @@ static void cliFlashErase(char *cmdline) cliPrintLine("Erasing,"); #endif - bufWriterFlush(cliWriter); + cliWriterFlush(); flashfsEraseCompletely(); while (!flashfsIsReady()) { @@ -2363,7 +2431,7 @@ static void cliFlashErase(char *cmdline) cliPrintLinefeed(); } - bufWriterFlush(cliWriter); + cliWriterFlush(); #endif delay(100); } @@ -3048,19 +3116,17 @@ static void cliMcuId(char *cmdline) cliPrintLinef("mcu_id %08x%08x%08x", U_ID_0, U_ID_1, U_ID_2); } -static uint32_t getFeatureMask(const uint32_t featureMask) +static uint32_t *getFeatureMask(void) { if (featureMaskIsCopied) { - return featureMaskCopy; + return &featureMaskCopy; } else { - return featureMask; + return &featureConfigMutable()->enabledFeatures; } } -static void printFeature(dumpFlags_t dumpMask, const featureConfig_t *featureConfig, const featureConfig_t *featureConfigDefault, const char *headingStr) +static void printFeature(dumpFlags_t dumpMask, const uint32_t mask, const uint32_t defaultMask, const char *headingStr) { - const uint32_t mask = getFeatureMask(featureConfig->enabledFeatures); - const uint32_t defaultMask = featureConfigDefault->enabledFeatures; headingStr = cliPrintSectionHeading(dumpMask, false, headingStr); for (uint32_t i = 0; featureNames[i]; i++) { // disabled features first if (strcmp(featureNames[i], emptyString) != 0) { //Skip unused @@ -3089,7 +3155,7 @@ static void printFeature(dumpFlags_t dumpMask, const featureConfig_t *featureCon static void cliFeature(char *cmdline) { uint32_t len = strlen(cmdline); - const uint32_t mask = getFeatureMask(featureMask()); + const uint32_t mask = *getFeatureMask(); if (len == 0) { cliPrint("Enabled: "); for (uint32_t i = 0; ; i++) { @@ -3112,8 +3178,8 @@ static void cliFeature(char *cmdline) cliPrintLinefeed(); return; } else { - if (!featureMaskIsCopied) { - featureMaskCopy = featureMask(); + if (!featureMaskIsCopied && !configIsInCopy) { + featureMaskCopy = featureConfig()->enabledFeatures; featureMaskIsCopied = true; } uint32_t feature; @@ -3147,10 +3213,10 @@ static void cliFeature(char *cmdline) } #endif if (remove) { - featureClear(feature, &featureMaskCopy); + featureClear(feature, getFeatureMask()); cliPrint("Disabled"); } else { - featureSet(feature, &featureMaskCopy); + featureSet(feature, getFeatureMask()); cliPrint("Enabled"); } cliPrintLinef(" %s", featureNames[i]); @@ -3392,7 +3458,7 @@ static char *checkCommand(char *cmdline, const char *command) static void cliRebootEx(rebootTarget_e rebootTarget) { cliPrint("\r\nRebooting"); - bufWriterFlush(cliWriter); + cliWriterFlush(); waitForSerialPortToFinishTransmitting(cliPort); motorShutdown(); @@ -3451,16 +3517,14 @@ static void cliExit(char *cmdline) UNUSED(cmdline); cliPrintHashLine("leaving CLI mode, unsaved changes lost"); - bufWriterFlush(cliWriter); + cliWriterFlush(); *cliBuffer = '\0'; bufferIndex = 0; - cliMode = 0; + cliMode = false; // incase a motor was left running during motortest, clear it here mixerResetDisarmedMotors(); cliReboot(); - - cliWriter = NULL; } #ifdef USE_GPS @@ -4074,6 +4138,12 @@ static void cliSave(char *cmdline) { UNUSED(cmdline); +#if defined(USE_CUSTOM_DEFAULTS) + if (processingCustomDefaults) { + return; + } +#endif + #ifdef USE_CLI_BATCH if (commandBatchActive && commandBatchError) { cliPrintCommandBatchWarning("PLEASE FIX ERRORS THEN 'SAVE'"); @@ -4104,15 +4174,51 @@ static void cliSave(char *cmdline) cliReboot(); } +#if defined(USE_CUSTOM_DEFAULTS) +static bool isDefaults(char *ptr) +{ + return strncmp(ptr, "# " FC_FIRMWARE_NAME, 12) == 0; +} +#endif + static void cliDefaults(char *cmdline) { - bool saveConfigs; + bool saveConfigs = true; +#if defined(USE_CUSTOM_DEFAULTS) + bool useCustomDefaults = true; +#elif defined(USE_CUSTOM_DEFAULTS_ADDRESS) + // Required to keep the linker from eliminating these + if (customDefaultsStart != customDefaultsEnd) { + delay(0); + } +#endif if (isEmpty(cmdline)) { - saveConfigs = true; } else if (strncasecmp(cmdline, "nosave", 6) == 0) { saveConfigs = false; +#if defined(USE_CUSTOM_DEFAULTS) + } else if (strncasecmp(cmdline, "bare", 4) == 0) { + useCustomDefaults = false; + } else if (strncasecmp(cmdline, "show", 4) == 0) { + char *customDefaultsPtr = customDefaultsStart; + if (isDefaults(customDefaultsPtr)) { + while (*customDefaultsPtr && *customDefaultsPtr != 0xFF && customDefaultsPtr < customDefaultsEnd) { + if (*customDefaultsPtr != '\n') { + cliPrintf("%c", *customDefaultsPtr++); + } else { + cliPrintLinefeed(); + customDefaultsPtr++; + } + } + } else { + cliPrintError("NO DEFAULTS FOUND"); + } + + return; +#endif } else { + cliPrintError("INVALID OPTION"); + return; } @@ -4128,6 +4234,12 @@ static void cliDefaults(char *cmdline) commandBatchError = false; #endif +#if defined(USE_CUSTOM_DEFAULTS) + if (useCustomDefaults) { + cliProcessCustomDefaults(); + } +#endif + if (saveConfigs) { cliSave(NULL); } @@ -4156,7 +4268,7 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) pidProfileIndexToUse = getCurrentPidProfileIndex(); rateProfileIndexToUse = getCurrentControlRateProfileIndex(); - backupAndResetConfigs(); + backupAndResetConfigs(true); for (uint32_t i = 0; i < valueTableEntryCount; i++) { if (strcasestr(valueTable[i].name, cmdline)) { @@ -4192,11 +4304,9 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) pidProfileIndexToUse = CURRENT_PROFILE_INDEX; rateProfileIndexToUse = CURRENT_PROFILE_INDEX; - if (matchedCommands) { - return; + if (!matchedCommands) { + cliPrintErrorLinef("INVALID NAME"); } - - cliPrintErrorLinef("INVALID NAME"); } static uint8_t getWordLength(char *bufBegin, char *bufEnd) @@ -4813,7 +4923,7 @@ static void printResource(dumpFlags_t dumpMask, const char *headingStr) const pgRegistry_t* pg = pgFind(resourceTable[i].pgn); const void *currentConfig; const void *defaultConfig; - if (configIsInCopy) { + if (isReadingConfigFromCopy()) { currentConfig = pg->copy; defaultConfig = pg->address; } else { @@ -5028,7 +5138,7 @@ static const char *printPeripheralDmaopt(dmaoptEntry_t *entry, int index, dumpFl const void *currentConfig; const void *defaultConfig; - if (configIsInCopy) { + if (isReadingConfigFromCopy()) { currentConfig = pg->copy; defaultConfig = pg->address; } else { @@ -5141,7 +5251,7 @@ static void printDmaopt(dumpFlags_t dumpMask, const char *headingStr) const timerIOConfig_t *currentConfig; const timerIOConfig_t *defaultConfig; - if (configIsInCopy) { + if (isReadingConfigFromCopy()) { currentConfig = (timerIOConfig_t *)pg->copy; defaultConfig = (timerIOConfig_t *)pg->address; } else { @@ -5218,7 +5328,7 @@ static void cliDmaopt(char *cmdline) const pgRegistry_t* pg = pgFind(entry->pgn); const void *currentConfig; - if (configIsInCopy) { + if (isWritingConfigToCopy()) { currentConfig = pg->copy; } else { currentConfig = pg->address; @@ -5375,7 +5485,7 @@ static void printTimer(dumpFlags_t dumpMask, const char *headingStr) const timerIOConfig_t *defaultConfig; headingStr = cliPrintSectionHeading(dumpMask, false, headingStr); - if (configIsInCopy) { + if (isReadingConfigFromCopy()) { currentConfig = (timerIOConfig_t *)pg->copy; defaultConfig = (timerIOConfig_t *)pg->address; } else { @@ -5784,7 +5894,7 @@ static void printConfig(char *cmdline, bool doDiff) dumpMask = dumpMask | BARE; // show the diff / dump without extra commands and board specific data } - backupAndResetConfigs(); + backupAndResetConfigs((dumpMask & BARE) == 0); #ifdef USE_CLI_BATCH bool batchModeEnabled = false; @@ -5859,7 +5969,7 @@ static void printConfig(char *cmdline, bool doDiff) #endif #endif - printFeature(dumpMask, &featureConfig_Copy, featureConfig(), "feature"); + printFeature(dumpMask, featureConfig_Copy.enabledFeatures, *getFeatureMask(), "feature"); #if defined(USE_BEEPER) printBeeper(dumpMask, beeperConfig_Copy.beeper_off_flags, beeperConfig()->beeper_off_flags, "beeper", BEEPER_ALLOWED_MODES, "beeper"); @@ -5989,7 +6099,7 @@ static void cliMsc(char *cmdline) #endif cliPrintHashLine("Restarting in mass storage mode"); cliPrint("\r\nRebooting"); - bufWriterFlush(cliWriter); + cliWriterFlush(); waitForSerialPortToFinishTransmitting(cliPort); motorShutdown(); @@ -6057,7 +6167,11 @@ const clicmd_t cmdTable[] = { #ifdef USE_LED_STRIP_STATUS_MODE CLI_COMMAND_DEF("color", "configure colors", NULL, cliColor), #endif - CLI_COMMAND_DEF("defaults", "reset to defaults and reboot", "[nosave]", cliDefaults), +#if defined(USE_CUSTOM_DEFAULTS) + CLI_COMMAND_DEF("defaults", "reset to defaults and reboot", "[nosave|bare|show]", cliDefaults), +#else + CLI_COMMAND_DEF("defaults", "reset to defaults and reboot", "[nosave|show]", cliDefaults), +#endif CLI_COMMAND_DEF("diff", "list configuration changes from default", "[master|profile|rates|hardware|all] {defaults|bare}", cliDiff), #ifdef USE_RESOURCE_MGMT @@ -6202,120 +6316,176 @@ static void cliHelp(char *cmdline) } } +static void processCharacter(const char c) +{ + if (bufferIndex && (c == '\n' || c == '\r')) { + // enter pressed + cliPrintLinefeed(); + +#if defined(USE_CUSTOM_DEFAULTS) && defined(DEBUG_CUSTOM_DEFAULTS) + if (processingCustomDefaults) { + cliPrint("d: "); + } +#endif + + // Strip comment starting with # from line + char *p = cliBuffer; + p = strchr(p, '#'); + if (NULL != p) { + bufferIndex = (uint32_t)(p - cliBuffer); + } + + // Strip trailing whitespace + while (bufferIndex > 0 && cliBuffer[bufferIndex - 1] == ' ') { + bufferIndex--; + } + + // Process non-empty lines + if (bufferIndex > 0) { + cliBuffer[bufferIndex] = 0; // null terminate + + const clicmd_t *cmd; + char *options; + for (cmd = cmdTable; cmd < cmdTable + ARRAYLEN(cmdTable); cmd++) { + if ((options = checkCommand(cliBuffer, cmd->name))) { + break; + } + } + if (cmd < cmdTable + ARRAYLEN(cmdTable)) { + cmd->func(options); + } else { + cliPrintError("UNKNOWN COMMAND, TRY 'HELP'"); + } + bufferIndex = 0; + } + + memset(cliBuffer, 0, sizeof(cliBuffer)); + + // 'exit' will reset this flag, so we don't need to print prompt again + if (!cliMode) { + return; + } + + cliPrompt(); + } else if (bufferIndex < sizeof(cliBuffer) && c >= 32 && c <= 126) { + if (!bufferIndex && c == ' ') + return; // Ignore leading spaces + cliBuffer[bufferIndex++] = c; + cliWrite(c); + } +} + +static void processCharacterInteractive(const char c) +{ + if (c == '\t' || c == '?') { + // do tab completion + const clicmd_t *cmd, *pstart = NULL, *pend = NULL; + uint32_t i = bufferIndex; + for (cmd = cmdTable; cmd < cmdTable + ARRAYLEN(cmdTable); cmd++) { + if (bufferIndex && (strncasecmp(cliBuffer, cmd->name, bufferIndex) != 0)) { + continue; + } + if (!pstart) { + pstart = cmd; + } + pend = cmd; + } + if (pstart) { /* Buffer matches one or more commands */ + for (; ; bufferIndex++) { + if (pstart->name[bufferIndex] != pend->name[bufferIndex]) + break; + if (!pstart->name[bufferIndex] && bufferIndex < sizeof(cliBuffer) - 2) { + /* Unambiguous -- append a space */ + cliBuffer[bufferIndex++] = ' '; + cliBuffer[bufferIndex] = '\0'; + break; + } + cliBuffer[bufferIndex] = pstart->name[bufferIndex]; + } + } + if (!bufferIndex || pstart != pend) { + /* Print list of ambiguous matches */ + cliPrint("\r\033[K"); + for (cmd = pstart; cmd <= pend; cmd++) { + cliPrint(cmd->name); + cliWrite('\t'); + } + cliPrompt(); + i = 0; /* Redraw prompt */ + } + for (; i < bufferIndex; i++) + cliWrite(cliBuffer[i]); + } else if (!bufferIndex && c == 4) { // CTRL-D + cliExit(cliBuffer); + return; + } else if (c == 12) { // NewPage / CTRL-L + // clear screen + cliPrint("\033[2J\033[1;1H"); + cliPrompt(); + } else if (c == 127) { + // backspace + if (bufferIndex) { + cliBuffer[--bufferIndex] = 0; + cliPrint("\010 \010"); + } + } else { + processCharacter(c); + } +} + void cliProcess(void) { if (!cliWriter) { return; } - // Be a little bit tricky. Flush the last inputs buffer, if any. - bufWriterFlush(cliWriter); + // Flush the buffer to get rid of any MSP data polls sent by configurator after CLI was invoked + cliWriterFlush(); while (serialRxBytesWaiting(cliPort)) { uint8_t c = serialRead(cliPort); - if (c == '\t' || c == '?') { - // do tab completion - const clicmd_t *cmd, *pstart = NULL, *pend = NULL; - uint32_t i = bufferIndex; - for (cmd = cmdTable; cmd < cmdTable + ARRAYLEN(cmdTable); cmd++) { - if (bufferIndex && (strncasecmp(cliBuffer, cmd->name, bufferIndex) != 0)) - continue; - if (!pstart) - pstart = cmd; - pend = cmd; - } - if (pstart) { /* Buffer matches one or more commands */ - for (; ; bufferIndex++) { - if (pstart->name[bufferIndex] != pend->name[bufferIndex]) - break; - if (!pstart->name[bufferIndex] && bufferIndex < sizeof(cliBuffer) - 2) { - /* Unambiguous -- append a space */ - cliBuffer[bufferIndex++] = ' '; - cliBuffer[bufferIndex] = '\0'; - break; - } - cliBuffer[bufferIndex] = pstart->name[bufferIndex]; - } - } - if (!bufferIndex || pstart != pend) { - /* Print list of ambiguous matches */ - cliPrint("\r\033[K"); - for (cmd = pstart; cmd <= pend; cmd++) { - cliPrint(cmd->name); - cliWrite('\t'); - } - cliPrompt(); - i = 0; /* Redraw prompt */ - } - for (; i < bufferIndex; i++) - cliWrite(cliBuffer[i]); - } else if (!bufferIndex && c == 4) { // CTRL-D - cliExit(cliBuffer); - return; - } else if (c == 12) { // NewPage / CTRL-L - // clear screen - cliPrint("\033[2J\033[1;1H"); - cliPrompt(); - } else if (bufferIndex && (c == '\n' || c == '\r')) { - // enter pressed - cliPrintLinefeed(); - // Strip comment starting with # from line - char *p = cliBuffer; - p = strchr(p, '#'); - if (NULL != p) { - bufferIndex = (uint32_t)(p - cliBuffer); - } - - // Strip trailing whitespace - while (bufferIndex > 0 && cliBuffer[bufferIndex - 1] == ' ') { - bufferIndex--; - } - - // Process non-empty lines - if (bufferIndex > 0) { - cliBuffer[bufferIndex] = 0; // null terminate - - const clicmd_t *cmd; - char *options; - for (cmd = cmdTable; cmd < cmdTable + ARRAYLEN(cmdTable); cmd++) { - if ((options = checkCommand(cliBuffer, cmd->name))) { - break; - } - } - if (cmd < cmdTable + ARRAYLEN(cmdTable)) { - cmd->func(options); - } else { - cliPrintError("UNKNOWN COMMAND, TRY 'HELP'"); - } - bufferIndex = 0; - } - - memset(cliBuffer, 0, sizeof(cliBuffer)); - - // 'exit' will reset this flag, so we don't need to print prompt again - if (!cliMode) - return; - - cliPrompt(); - } else if (c == 127) { - // backspace - if (bufferIndex) { - cliBuffer[--bufferIndex] = 0; - cliPrint("\010 \010"); - } - } else if (bufferIndex < sizeof(cliBuffer) && c >= 32 && c <= 126) { - if (!bufferIndex && c == ' ') - continue; // Ignore leading spaces - cliBuffer[bufferIndex++] = c; - cliWrite(c); - } + processCharacterInteractive(c); } } +#if defined(USE_CUSTOM_DEFAULTS) +void cliProcessCustomDefaults(void) +{ + if (processingCustomDefaults) { + return; + } + + char *customDefaultsPtr = customDefaultsStart; + if (isDefaults(customDefaultsPtr)) { +#if !defined(DEBUG_CUSTOM_DEFAULTS) + bufWriter_t *cliWriterTemp = cliWriter; + cliWriter = NULL; +#endif + memcpy(cliBufferTemp, cliBuffer, sizeof(cliBuffer)); + uint32_t bufferIndexTemp = bufferIndex; + bufferIndex = 0; + processingCustomDefaults = true; + + while (*customDefaultsPtr && *customDefaultsPtr != 0xFF && customDefaultsPtr < customDefaultsEnd) { + processCharacter(*customDefaultsPtr++); + } + + processingCustomDefaults = false; +#if !defined(DEBUG_CUSTOM_DEFAULTS) + cliWriter = cliWriterTemp; +#endif + memcpy(cliBuffer, cliBufferTemp, sizeof(cliBuffer)); + bufferIndex = bufferIndexTemp; + } else { + cliPrintError("NO DEFAULTS FOUND"); + } +} +#endif + void cliEnter(serialPort_t *serialPort) { - cliMode = 1; + cliMode = true; cliPort = serialPort; setPrintfSerialPort(cliPort); cliWriter = bufWriterInit(cliWriteBuffer, sizeof(cliWriteBuffer), (bufWrite_t)serialWriteBufShim, serialPort); @@ -6335,9 +6505,4 @@ void cliEnter(serialPort_t *serialPort) resetCommandBatch(); #endif } - -void cliInit(const serialConfig_t *serialConfig) -{ - UNUSED(serialConfig); -} #endif // USE_CLI diff --git a/src/main/cli/cli.h b/src/main/cli/cli.h index 2566832756..29875b76ae 100644 --- a/src/main/cli/cli.h +++ b/src/main/cli/cli.h @@ -20,14 +20,11 @@ #pragma once -extern uint8_t cliMode; +#include -struct clivalue_s; -void *cliGetValuePointer(const struct clivalue_s *value); -const void *cliGetDefaultPointer(const struct clivalue_s *value); +extern bool cliMode; -struct serialConfig_s; -void cliInit(const struct serialConfig_s *serialConfig); void cliProcess(void); +void cliProcessCustomDefaults(void); struct serialPort_s; void cliEnter(struct serialPort_s *serialPort); diff --git a/src/main/config/feature.c b/src/main/config/feature.c index a1d55cf699..b703592e6b 100644 --- a/src/main/config/feature.c +++ b/src/main/config/feature.c @@ -64,8 +64,3 @@ void featureDisableAll(void) { featureConfigMutable()->enabledFeatures = 0; } - -uint32_t featureMask(void) -{ - return featureConfig()->enabledFeatures; -} diff --git a/src/main/config/feature.h b/src/main/config/feature.h index f8f9a16764..3aeb0d0fd6 100644 --- a/src/main/config/feature.h +++ b/src/main/config/feature.h @@ -66,7 +66,6 @@ bool featureIsEnabled(const uint32_t mask); void featureEnable(const uint32_t mask); void featureDisable(const uint32_t mask); void featureDisableAll(void); -uint32_t featureMask(void); void featureSet(const uint32_t mask, uint32_t *features); void featureClear(const uint32_t mask, uint32_t *features); diff --git a/src/main/fc/init.c b/src/main/fc/init.c index 7bdd605dd1..793265a093 100644 --- a/src/main/fc/init.c +++ b/src/main/fc/init.c @@ -30,8 +30,6 @@ #include "build/build_config.h" #include "build/debug.h" -#include "cli/cli.h" - #include "cms/cms.h" #include "cms/cms_types.h" @@ -725,10 +723,6 @@ void init(void) mspInit(); mspSerialInit(); -#ifdef USE_CLI - cliInit(serialConfig()); -#endif - failsafeInit(); rxInit(); diff --git a/src/main/msp/msp.c b/src/main/msp/msp.c index 65691cbd48..de7c257222 100644 --- a/src/main/msp/msp.c +++ b/src/main/msp/msp.c @@ -177,7 +177,7 @@ static uint32_t getFeatureMask(void) if (featureMaskIsCopied) { return featureMaskCopy; } else { - return featureMask(); + return featureConfig()->enabledFeatures; } } diff --git a/src/main/target/KISSFCV2F7/target.h b/src/main/target/KISSFCV2F7/target.h index 8bb1f72221..3c375b546c 100644 --- a/src/main/target/KISSFCV2F7/target.h +++ b/src/main/target/KISSFCV2F7/target.h @@ -26,6 +26,8 @@ #define USBD_PRODUCT_STRING "KISSFCV2F7" +#undef USE_CUSTOM_DEFAULTS_ADDRESS + #define LED0_PIN PA8 // blue #define LED1_PIN PC8 // blingbling #define LED1_INVERTED diff --git a/src/main/target/OMNIBUSF4/target.h b/src/main/target/OMNIBUSF4/target.h index c93f11d0f6..2d517ac381 100644 --- a/src/main/target/OMNIBUSF4/target.h +++ b/src/main/target/OMNIBUSF4/target.h @@ -56,6 +56,8 @@ #define USBD_PRODUCT_STRING "OmnibusF4" #endif +#define USE_CUSTOM_DEFAULTS + #define LED0_PIN PB5 #define USE_BEEPER #define BEEPER_PIN PB4 diff --git a/src/main/target/STM32F405/target.mk b/src/main/target/STM32F405/target.mk index 9165ce9234..b870edfa15 100644 --- a/src/main/target/STM32F405/target.mk +++ b/src/main/target/STM32F405/target.mk @@ -1,6 +1,9 @@ F405_TARGETS += $(TARGET) + FEATURES += SDCARD_SPI VCP ONBOARDFLASH +CUSTOM_DEFAULTS_EXTENDED = yes + TARGET_SRC = \ $(addprefix drivers/accgyro/,$(notdir $(wildcard $(SRC_DIR)/drivers/accgyro/*.c))) \ $(addprefix drivers/barometer/,$(notdir $(wildcard $(SRC_DIR)/drivers/barometer/*.c))) \ diff --git a/src/main/target/STM32F411/target.mk b/src/main/target/STM32F411/target.mk index 927bba94a2..a6a0fd4457 100644 --- a/src/main/target/STM32F411/target.mk +++ b/src/main/target/STM32F411/target.mk @@ -2,6 +2,8 @@ F411_TARGETS += $(TARGET) FEATURES += SDCARD_SPI VCP ONBOARDFLASH +CUSTOM_DEFAULTS_EXTENDED = yes + TARGET_SRC = \ $(addprefix drivers/accgyro/,$(notdir $(wildcard $(SRC_DIR)/drivers/accgyro/*.c))) \ $(addprefix drivers/barometer/,$(notdir $(wildcard $(SRC_DIR)/drivers/barometer/*.c))) \ diff --git a/src/main/target/STM32F411DISCOVERY/target.mk b/src/main/target/STM32F411DISCOVERY/target.mk index c23735e60f..83931bc244 100644 --- a/src/main/target/STM32F411DISCOVERY/target.mk +++ b/src/main/target/STM32F411DISCOVERY/target.mk @@ -1,4 +1,5 @@ F411_TARGETS += $(TARGET) + FEATURES += VCP SDCARD_SPI ONBOARDFLASH TARGET_SRC = \ diff --git a/src/main/target/STM32F4DISCOVERY/target.mk b/src/main/target/STM32F4DISCOVERY/target.mk index 3a09402a71..0a9e14bd26 100644 --- a/src/main/target/STM32F4DISCOVERY/target.mk +++ b/src/main/target/STM32F4DISCOVERY/target.mk @@ -1,4 +1,5 @@ F405_TARGETS += $(TARGET) + FEATURES += VCP SDCARD_SPI MSC TARGET_SRC = \ diff --git a/src/main/target/STM32F745/target.mk b/src/main/target/STM32F745/target.mk index 9a7a445828..d6f9a6f228 100644 --- a/src/main/target/STM32F745/target.mk +++ b/src/main/target/STM32F745/target.mk @@ -1,6 +1,9 @@ F7X5XG_TARGETS += $(TARGET) + FEATURES += SDCARD_SPI VCP ONBOARDFLASH +CUSTOM_DEFAULTS_EXTENDED = yes + TARGET_SRC = \ $(addprefix drivers/accgyro/,$(notdir $(wildcard $(SRC_DIR)/drivers/accgyro/*.c))) \ $(addprefix drivers/barometer/,$(notdir $(wildcard $(SRC_DIR)/drivers/barometer/*.c))) \ diff --git a/src/main/target/STM32F7X2/target.mk b/src/main/target/STM32F7X2/target.mk index d49485e5c3..2ea79d2daf 100644 --- a/src/main/target/STM32F7X2/target.mk +++ b/src/main/target/STM32F7X2/target.mk @@ -1,6 +1,9 @@ F7X2RE_TARGETS += $(TARGET) + FEATURES += SDCARD_SPI VCP ONBOARDFLASH +CUSTOM_DEFAULTS_EXTENDED = yes + TARGET_SRC = \ $(addprefix drivers/accgyro/,$(notdir $(wildcard $(SRC_DIR)/drivers/accgyro/*.c))) \ $(addprefix drivers/barometer/,$(notdir $(wildcard $(SRC_DIR)/drivers/barometer/*.c))) \ diff --git a/src/main/target/common_post.h b/src/main/target/common_post.h index e969155365..119dae4475 100644 --- a/src/main/target/common_post.h +++ b/src/main/target/common_post.h @@ -372,3 +372,7 @@ extern uint8_t __config_end; #ifndef USE_ITERM_RELAX #undef USE_ABSOLUTE_CONTROL #endif + +#if defined(USE_CUSTOM_DEFAULTS) +#define USE_CUSTOM_DEFAULTS_ADDRESS +#endif diff --git a/src/main/target/common_pre.h b/src/main/target/common_pre.h index d613565a14..e3fb6c0fdb 100644 --- a/src/main/target/common_pre.h +++ b/src/main/target/common_pre.h @@ -67,6 +67,7 @@ #define USE_DMA_SPEC #define USE_TIMER_MGMT #define USE_PERSISTENT_OBJECTS +#define USE_CUSTOM_DEFAULTS_ADDRESS // Re-enable this after 4.0 has been released, and remove the define from STM32F4DISCOVERY //#define USE_SPI_TRANSACTION @@ -97,6 +98,7 @@ #define USE_DMA_SPEC #define USE_TIMER_MGMT #define USE_PERSISTENT_OBJECTS +#define USE_CUSTOM_DEFAULTS_ADDRESS // Re-enable this after 4.0 has been released, and remove the define from STM32F4DISCOVERY //#define USE_SPI_TRANSACTION #endif // STM32F7 diff --git a/src/main/target/common_unified.h b/src/main/target/common_unified.h index d1f1690ac0..da15c3bbfb 100644 --- a/src/main/target/common_unified.h +++ b/src/main/target/common_unified.h @@ -117,3 +117,5 @@ #define USE_RX_FLYSKY #define USE_RX_FLYSKY_SPI_LED + +#define USE_CUSTOM_DEFAULTS diff --git a/src/test/unit/cli_unittest.cc b/src/test/unit/cli_unittest.cc index d0d47ca0e6..2c9c45a796 100644 --- a/src/test/unit/cli_unittest.cc +++ b/src/test/unit/cli_unittest.cc @@ -56,6 +56,7 @@ extern "C" { void cliSet(char *cmdline); void cliGet(char *cmdline); int cliGetSettingIndex(char *name, uint8_t length); + void *cliGetValuePointer(const clivalue_t *value); const clivalue_t valueTable[] = { { "array_unit_test", VAR_INT8 | MODE_ARRAY | MASTER_VALUE, .config.array.length = 3, PG_RESERVED_FOR_TESTING_1, 0 }, @@ -356,4 +357,6 @@ bool persistBoardInformation(void) { return true; }; void activeAdjustmentRangeReset(void) {} void analyzeModeActivationConditions(void) {} bool isModeActivationConditionConfigured(const modeActivationCondition_t *, const modeActivationCondition_t *) { return false; } + +void delay(uint32_t) {} } diff --git a/src/utils/make_config_hex.sh b/src/utils/make_config_hex.sh new file mode 100755 index 0000000000..1705d9885a --- /dev/null +++ b/src/utils/make_config_hex.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +INPUT_FILE=$1 +DESTINATION_DIR=$2 + +TARGET_ADDRESS=0x080FC000 + +srec_cat ${INPUT_FILE} -binary -offset ${TARGET_ADDRESS} \ + -generate '(' -maximum-address ${INPUT_FILE} -binary -maximum-address ${INPUT_FILE} -binary -offset 1 ')' \ + -constant 0x00 -offset ${TARGET_ADDRESS} \ + -output ${DESTINATION_DIR}/$(basename ${INPUT_FILE}).hex -intel