From 09ea369b443eb45801b574248ca86a33b6997b07 Mon Sep 17 00:00:00 2001 From: mikeller Date: Wed, 16 May 2018 23:28:11 +1200 Subject: [PATCH 01/24] Added target independence check to travis 'test' target. --- .travis.sh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.travis.sh b/.travis.sh index 7332d8aaaf..1be2465df8 100755 --- a/.travis.sh +++ b/.travis.sh @@ -66,16 +66,20 @@ elif [ $TARGET ] ; then fi elif [ $GOAL ] ; then + if [ "test" == "$GOAL" ] ; then + $MAKE check-target-independence || exit $? + fi + $MAKE $GOAL || exit $? - if [ $PUBLISHCOV ] ; then - if [ "test" == "$GOAL" ] ; then - lcov --directory . -b src/test --capture --output-file coverage.info 2>&1 | grep -E ":version '402\*', prefer.*'406\*" --invert-match - lcov --remove coverage.info 'lib/test/*' 'src/test/*' '/usr/*' --output-file coverage.info # filter out system and test code - lcov --list coverage.info # debug before upload - coveralls-lcov coverage.info # uploads to coveralls + if [ $PUBLISHCOV ] ; then + if [ "test" == "$GOAL" ] ; then + lcov --directory . -b src/test --capture --output-file coverage.info 2>&1 | grep -E ":version '402\*', prefer.*'406\*" --invert-match + lcov --remove coverage.info 'lib/test/*' 'src/test/*' '/usr/*' --output-file coverage.info # filter out system and test code + lcov --list coverage.info # debug before upload + coveralls-lcov coverage.info # uploads to coveralls + fi fi - fi else $MAKE all fi From fdee2e52283c7578f5e41a2680eea4bcc4c8a01f Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Wed, 16 May 2018 10:12:37 -0400 Subject: [PATCH 02/24] Break out rc interpolation as a separate task and run before pid controller and motor update Fixes an issue with motor "spikes" when rc interpolation was enabled for throttle. The problem was that the smoothing was happening too late in the sequence and the earlier process subTaskMotorUpdate() would use the unsmoothed throttle value in the mixer if new rx data had come in between the last and current PID loop. Also because the setPointRate was calculated at the end of the smoothing, the PID controller would always be using the value from the previous loop iteration. --- src/main/fc/fc_core.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/fc/fc_core.c b/src/main/fc/fc_core.c index 5a58801899..c21e167027 100644 --- a/src/main/fc/fc_core.c +++ b/src/main/fc/fc_core.c @@ -905,8 +905,6 @@ static NOINLINE void subTaskMainSubprocesses(timeUs_t currentTimeUs) rcCommand[THROTTLE] += calculateThrottleAngleCorrection(throttleCorrectionConfig()->throttle_correction_value); } - processRcCommand(); - #ifdef USE_SDCARD afatfs_poll(); #endif @@ -958,6 +956,12 @@ static void subTaskMotorUpdate(timeUs_t currentTimeUs) DEBUG_SET(DEBUG_PIDLOOP, 2, micros() - startTime); } +static void subTaskRcCommand(timeUs_t currentTimeUs) +{ + processRcCommand(); + UNUSED(currentTimeUs); +} + // Function for loop trigger FAST_CODE void taskMainPidLoop(timeUs_t currentTimeUs) { @@ -976,6 +980,7 @@ FAST_CODE void taskMainPidLoop(timeUs_t currentTimeUs) DEBUG_SET(DEBUG_PIDLOOP, 0, micros() - currentTimeUs); if (pidUpdateCounter++ % pidConfig()->pid_process_denom == 0) { + subTaskRcCommand(currentTimeUs); subTaskPidController(currentTimeUs); subTaskMotorUpdate(currentTimeUs); subTaskMainSubprocesses(currentTimeUs); From 60f3f7a8bcf935dadc5c25f0e58f11b81f4dab91 Mon Sep 17 00:00:00 2001 From: mikeller Date: Thu, 17 May 2018 23:30:41 +1200 Subject: [PATCH 03/24] Removed unneeded declaration of 'updateRcCommands()'. --- src/main/fc/fc_core.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/fc/fc_core.h b/src/main/fc/fc_core.h index 14c02deb1d..95d9655857 100644 --- a/src/main/fc/fc_core.h +++ b/src/main/fc/fc_core.h @@ -47,7 +47,6 @@ void tryArm(void); bool processRx(timeUs_t currentTimeUs); void updateArmingStatus(void); -void updateRcCommands(void); void taskMainPidLoop(timeUs_t currentTimeUs); bool isFlipOverAfterCrashMode(void); From 1f04d74b62f994896bb265238b313b1110170515 Mon Sep 17 00:00:00 2001 From: jirif Date: Thu, 17 May 2018 18:24:43 +0200 Subject: [PATCH 04/24] Smartport not working without USE_ESC_SENSOR --- src/main/telemetry/smartport.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/telemetry/smartport.c b/src/main/telemetry/smartport.c index 1c4300781f..c12b20bc36 100644 --- a/src/main/telemetry/smartport.c +++ b/src/main/telemetry/smartport.c @@ -495,11 +495,7 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear static uint8_t smartPortIdCycleCnt = 0; if (smartPortIdCycleCnt % SENSOR_REST_PERIOD == 0) { -#ifdef USE_ESC_SENSOR smartPortIdCycleCnt++; -#else - smartPortIdCycleCnt = 0; -#endif return; } @@ -520,9 +516,11 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear if (smartPortIdCycleCnt < ESC_SENSOR_PERIOD) { // send other sensors tableInfo = &frSkyDataIdTableInfo; +#endif if (tableInfo->index == tableInfo->size) { // end of table reached, loop back tableInfo->index = 0; } +#ifdef USE_ESC_SENSOR } #endif uint16_t id = tableInfo->table[tableInfo->index]; From 4423bf901885c625687a79e5262bd17dfc8d754a Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Thu, 17 May 2018 15:48:14 -0400 Subject: [PATCH 05/24] Ignore leading whitespace for cli command parameters --- src/main/interface/cli.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/interface/cli.c b/src/main/interface/cli.c index 8525b0ee48..0c8e345e38 100644 --- a/src/main/interface/cli.c +++ b/src/main/interface/cli.c @@ -2370,11 +2370,20 @@ static void cliMap(char *cmdline) cliPrintLinef("map %s", buf); } +static char *skipSpace(char *buffer) +{ + while (*(buffer) == ' ') { + buffer++; + } + + return buffer; +} + static char *checkCommand(char *cmdLine, const char *command) { if (!strncasecmp(cmdLine, command, strlen(command)) // command names match && (isspace((unsigned)cmdLine[strlen(command)]) || cmdLine[strlen(command)] == 0)) { - return cmdLine + strlen(command) + 1; + return skipSpace(cmdLine + strlen(command) + 1); } else { return 0; } @@ -3029,15 +3038,6 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) cliPrintLine("Invalid name"); } -static char *skipSpace(char *buffer) -{ - while (*(buffer) == ' ') { - buffer++; - } - - return buffer; -} - static uint8_t getWordLength(char *bufBegin, char *bufEnd) { while (*(bufEnd - 1) == ' ') { From 119571f77eb21d87dfce5314ab2fa1dc0902b97c Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Thu, 17 May 2018 18:05:40 -0400 Subject: [PATCH 06/24] Add responses for cli commands that were missing them for consistency Most cli commands give some feedback if the command was successful. However a few did not return a response to provide an indication that the command was successful. This change adds feedback responses for the following commands: adjrange color led rxrange serial servo vtx --- src/main/interface/cli.c | 67 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/src/main/interface/cli.c b/src/main/interface/cli.c index 8525b0ee48..4b96d7ce28 100644 --- a/src/main/interface/cli.c +++ b/src/main/interface/cli.c @@ -908,6 +908,7 @@ static void printSerial(uint8_t dumpMask, const serialConfig_t *serialConfig, co static void cliSerial(char *cmdline) { + const char *format = "serial %d %d %ld %ld %ld %ld"; if (isEmpty(cmdline)) { printSerial(DUMP_MASTER, serialConfig(), NULL); return; @@ -984,6 +985,16 @@ static void cliSerial(char *cmdline) } memcpy(currentConfig, &portConfig, sizeof(portConfig)); + + cliDumpPrintLinef(0, false, format, + portConfig.identifier, + portConfig.functionMask, + baudRates[portConfig.msp_baudrateIndex], + baudRates[portConfig.gps_baudrateIndex], + baudRates[portConfig.telemetry_baudrateIndex], + baudRates[portConfig.blackbox_baudrateIndex] + ); + } #ifndef SKIP_SERIAL_PASSTHROUGH @@ -1159,6 +1170,7 @@ static void printAdjustmentRange(uint8_t dumpMask, const adjustmentRange_t *adju static void cliAdjustmentRange(char *cmdline) { + const char *format = "adjrange %u %u %u %u %u %u %u %u %u"; int i, val = 0; const char *ptr; @@ -1210,6 +1222,7 @@ static void cliAdjustmentRange(char *cmdline) if (validArgumentCount != 6) { memset(ar, 0, sizeof(adjustmentRange_t)); cliShowParseError(); + return; } // Optional arguments @@ -1228,6 +1241,18 @@ static void cliAdjustmentRange(char *cmdline) ar->adjustmentScale = val; validArgumentCount++; } + cliDumpPrintLinef(0, false, format, + i, + ar->adjustmentIndex, + ar->auxChannelIndex, + MODE_STEP_TO_CHANNEL_VALUE(ar->range.startStep), + MODE_STEP_TO_CHANNEL_VALUE(ar->range.endStep), + ar->adjustmentFunction, + ar->auxSwitchChannelIndex, + ar->adjustmentCenter, + ar->adjustmentScale + ); + } else { cliShowArgumentRangeError("index", 0, MAX_ADJUSTMENT_RANGE_COUNT - 1); } @@ -1367,6 +1392,7 @@ static void printRxRange(uint8_t dumpMask, const rxChannelRangeConfig_t *channel static void cliRxRange(char *cmdline) { + const char *format = "rxrange %u %u %u"; int i, validArgumentCount = 0; const char *ptr; @@ -1400,6 +1426,12 @@ static void cliRxRange(char *cmdline) rxChannelRangeConfig_t *channelRangeConfig = rxChannelRangeConfigsMutable(i); channelRangeConfig->min = rangeMin; channelRangeConfig->max = rangeMax; + cliDumpPrintLinef(0, false, format, + i, + channelRangeConfig->min, + channelRangeConfig->max + ); + } } else { cliShowArgumentRangeError("channel", 0, NON_AUX_CHANNEL_COUNT - 1); @@ -1429,6 +1461,8 @@ static void printLed(uint8_t dumpMask, const ledConfig_t *ledConfigs, const ledC static void cliLed(char *cmdline) { + const char *format = "led %u %s"; + char ledConfigBuffer[20]; int i; const char *ptr; @@ -1439,7 +1473,10 @@ static void cliLed(char *cmdline) i = atoi(ptr); if (i < LED_MAX_STRIP_LENGTH) { ptr = nextArg(cmdline); - if (!parseLedStripConfig(i, ptr)) { + if (parseLedStripConfig(i, ptr)) { + generateLedConfig((ledConfig_t *)&ledStripConfig()->ledConfigs[i], ledConfigBuffer, sizeof(ledConfigBuffer)); + cliDumpPrintLinef(0, false, format, i, ledConfigBuffer); + } else { cliShowParseError(); } } else { @@ -1467,6 +1504,7 @@ static void printColor(uint8_t dumpMask, const hsvColor_t *colors, const hsvColo static void cliColor(char *cmdline) { + const char *format = "color %u %d,%u,%u"; if (isEmpty(cmdline)) { printColor(DUMP_MASTER, ledStripConfig()->colors, NULL); } else { @@ -1474,7 +1512,10 @@ static void cliColor(char *cmdline) const int i = atoi(ptr); if (i < LED_CONFIGURABLE_COLOR_COUNT) { ptr = nextArg(cmdline); - if (!parseColor(i, ptr)) { + if (parseColor(i, ptr)) { + const hsvColor_t *color = &ledStripConfig()->colors[i]; + cliDumpPrintLinef(0, false, format, i, color->h, color->s, color->v); + } else { cliShowParseError(); } } else { @@ -1614,6 +1655,7 @@ static void printServo(uint8_t dumpMask, const servoParam_t *servoParams, const static void cliServo(char *cmdline) { + const char *format = "servo %u %d %d %d %d %d"; enum { SERVO_ARGUMENT_COUNT = 6 }; int16_t arguments[SERVO_ARGUMENT_COUNT]; @@ -1681,6 +1723,16 @@ static void cliServo(char *cmdline) servo->middle = arguments[MIDDLE]; servo->rate = arguments[RATE]; servo->forwardFromChannel = arguments[FORWARD]; + + cliDumpPrintLinef(0, false, format, + i, + servo->min, + servo->max, + servo->middle, + servo->rate, + servo->forwardFromChannel + ); + } } #endif @@ -2050,6 +2102,7 @@ static void printVtx(uint8_t dumpMask, const vtxConfig_t *vtxConfig, const vtxCo static void cliVtx(char *cmdline) { + const char *format = "vtx %u %u %u %u %u %u"; int i, val = 0; const char *ptr; @@ -2091,6 +2144,16 @@ static void cliVtx(char *cmdline) if (validArgumentCount != 5) { memset(cac, 0, sizeof(vtxChannelActivationCondition_t)); + cliShowParseError(); + } else { + cliDumpPrintLinef(0, false, format, + i, + cac->auxChannelIndex, + cac->band, + cac->channel, + MODE_STEP_TO_CHANNEL_VALUE(cac->range.startStep), + MODE_STEP_TO_CHANNEL_VALUE(cac->range.endStep) + ); } } else { cliShowArgumentRangeError("index", 0, MAX_CHANNEL_ACTIVATION_CONDITION_COUNT - 1); From 847e050955fb1dfcef7f8021c38abae8efbf73bb Mon Sep 17 00:00:00 2001 From: mikeller Date: Sun, 20 May 2018 00:55:07 +1200 Subject: [PATCH 07/24] Reorganised static variables in SmartPort code. --- src/main/telemetry/smartport.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/telemetry/smartport.c b/src/main/telemetry/smartport.c index c12b20bc36..aca2877807 100644 --- a/src/main/telemetry/smartport.c +++ b/src/main/telemetry/smartport.c @@ -455,6 +455,13 @@ static void smartPortSendMspResponse(uint8_t *data) { void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clearToSend, const uint32_t *requestTimeout) { + static uint8_t smartPortIdCycleCnt = 0; + static uint8_t t1Cnt = 0; + static uint8_t t2Cnt = 0; +#ifdef USE_ESC_SENSOR + static uint8_t smartPortIdOffset = 0; +#endif + if (payload) { // do not check the physical ID here again // unless we start receiving other sensors' packets @@ -493,14 +500,12 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear // we can send back any data we want, our tables keep track of the order and frequency of each data type we send frSkyTableInfo_t * tableInfo = &frSkyDataIdTableInfo; - static uint8_t smartPortIdCycleCnt = 0; if (smartPortIdCycleCnt % SENSOR_REST_PERIOD == 0) { smartPortIdCycleCnt++; return; } #ifdef USE_ESC_SENSOR - static uint8_t smartPortIdOffset = 0; if (smartPortIdCycleCnt >= ESC_SENSOR_PERIOD) { // send ESC sensors tableInfo = &frSkyEscDataIdTableInfo; @@ -534,8 +539,6 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear int32_t tmpi; uint32_t tmp2 = 0; - static uint8_t t1Cnt = 0; - static uint8_t t2Cnt = 0; uint16_t vfasVoltage; uint8_t cellCount; From 57854eefc480d1f2ba56b55aba14067d5dcca601 Mon Sep 17 00:00:00 2001 From: mikeller Date: Mon, 21 May 2018 13:04:56 +1200 Subject: [PATCH 08/24] Cleaned up SDK version check. --- .travis.yml | 53 +++++++++++++++++++++++---------------------------- make/tools.mk | 5 +++++ 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2439f09a03..2c6eb9e53a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,26 @@ +os: + - linux + +sudo: false + +dist: trusty + +addons: + apt: + packages: + - lcov + - build-essential + - git + - libc6-i386 + - time + - libblocksruntime-dev + +git: + depth: 5 + +# We use cpp for unit tests, and c for the main project. +language: cpp +compiler: clang env: # - PUBLISHMETA=True @@ -18,28 +41,6 @@ env: # - TARGET=AIORACERF3 # - TARGET=... -# use new docker environment -sudo: false - -git: - depth: 5 - -addons: - apt: - packages: - - lcov - - build-essential - - git - - libc6-i386 - - time - - libblocksruntime-dev - -# We use cpp for unit tests, and c for the main project. -language: cpp -compiler: clang -dist: trusty - - before_install: - pip install --user cpp-coveralls - gem install coveralls-lcov @@ -48,7 +49,7 @@ install: - make arm_sdk_install before_script: - - tools/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-none-eabi-gcc --version + - make arm_sdk_version - clang --version - clang++ --version - gcc --version @@ -60,12 +61,6 @@ cache: - downloads - tools - -#notifications: -# irc: "chat.freenode.net#cleanflight" -# use_notice: true -# skip_join: true - notifications: slack: betaflightgroup:LQSj02nsBEdefcO5UQcLgB0U webhooks: diff --git a/make/tools.mk b/make/tools.mk index d29e8d47d2..52d71adb26 100644 --- a/make/tools.mk +++ b/make/tools.mk @@ -18,6 +18,11 @@ ARM_SDK_DIR ?= $(TOOLS_DIR)/gcc-arm-none-eabi-7-2017-q4-major # Checked below, Should match the output of $(shell arm-none-eabi-gcc -dumpversion) GCC_REQUIRED_VERSION ?= 7.2.1 +.PHONY: arm_sdk_version + +arm_sdk_version: + $(V1) $(ARM_SDK_PREFIX)gcc --version + ## arm_sdk_install : Install Arm SDK .PHONY: arm_sdk_install From b12a4270ba5f898b62c8f57f30b8ab1b49f09e43 Mon Sep 17 00:00:00 2001 From: jflyper Date: Mon, 21 May 2018 12:03:11 +0900 Subject: [PATCH 09/24] Add compass exit configurability --- src/main/interface/cli.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/interface/cli.c b/src/main/interface/cli.c index 273fdd8afa..4d91041421 100644 --- a/src/main/interface/cli.c +++ b/src/main/interface/cli.c @@ -3500,6 +3500,9 @@ const cliResourceValue_t resourceTable[] = { #endif #ifdef USE_MAG DEFS( OWNER_COMPASS_CS, PG_COMPASS_CONFIG, compassConfig_t, mag_spi_csn ), +#ifdef USE_MAG_DATA_READY_SIGNAL + DEFS( OWNER_COMPASS_EXTI, PG_COMPASS_CONFIG, compassConfig_t, interruptTag ), +#endif #endif #ifdef USE_SDCARD DEFS( OWNER_SDCARD_CS, PG_SDCARD_CONFIG, sdcardConfig_t, chipSelectTag ), From 557d704b9e0569efce149afea6b699d516bf85ab Mon Sep 17 00:00:00 2001 From: mikeller Date: Mon, 21 May 2018 15:07:36 +1200 Subject: [PATCH 10/24] Fixed RC modes PG version after GPS rescue. --- src/main/fc/rc_modes.c | 2 +- src/main/fc/rc_modes.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/fc/rc_modes.c b/src/main/fc/rc_modes.c index 42077533fa..dde865ed27 100644 --- a/src/main/fc/rc_modes.c +++ b/src/main/fc/rc_modes.c @@ -42,7 +42,7 @@ boxBitmask_t rcModeActivationMask; // one bit per mode defined in boxId_e static bool modeChangesDisabled = false; PG_REGISTER_ARRAY(modeActivationCondition_t, MAX_MODE_ACTIVATION_CONDITION_COUNT, modeActivationConditions, - PG_MODE_ACTIVATION_PROFILE, 0); + PG_MODE_ACTIVATION_PROFILE, 1); bool IS_RC_MODE_ACTIVE(boxId_e boxId) { diff --git a/src/main/fc/rc_modes.h b/src/main/fc/rc_modes.h index 78661ecd23..2a2dafeca4 100644 --- a/src/main/fc/rc_modes.h +++ b/src/main/fc/rc_modes.h @@ -43,6 +43,8 @@ typedef enum { BOXGPSRESCUE, BOXID_FLIGHTMODE_LAST = BOXGPSRESCUE, +// When new flight modes are added, the parameter group version for 'modeActivationConditions' in src/main/fc/rc_modes.c has to be incremented to ensure that the RC modes configuration is reset. + // RCMODE flags BOXANTIGRAVITY, BOXHEADADJ, From fc2f01cdf7ed96701673205d6317da89d083be64 Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Mon, 21 May 2018 17:25:20 -0400 Subject: [PATCH 11/24] Add default display to cli get command if value has been changed Presents the user with the default value for reference when displaying a parameter with the "get" command - but only if the current value differs from the default. --- src/main/interface/cli.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/interface/cli.c b/src/main/interface/cli.c index 273fdd8afa..257cc5e49f 100644 --- a/src/main/interface/cli.c +++ b/src/main/interface/cli.c @@ -3075,6 +3075,24 @@ static void cliDefaults(char *cmdline) } } +void cliPrintVarDefault(const clivalue_t *value) +{ + const pgRegistry_t *pg = pgFind(value->pgn); + if (pg) { + const char *defaultFormat = "Default value: "; + const int valueOffset = getValueOffset(value); + memcpy(pg->copy, pg->address, pg->size); + pgReset(pg); + const bool equalsDefault = valuePtrEqualsDefault(value, pg->copy + valueOffset, pg->address + valueOffset); + if (!equalsDefault) { + cliPrintf(defaultFormat, value->name); + printValuePointer(value, (uint8_t*)pg->address + valueOffset, false); + cliPrintLinefeed(); + } + memcpy(pg->address, pg->copy, pg->size); + } +} + STATIC_UNIT_TESTED void cliGet(char *cmdline) { const clivalue_t *val; @@ -3083,12 +3101,14 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) for (uint32_t i = 0; i < valueTableEntryCount; i++) { if (strcasestr(valueTable[i].name, cmdline)) { val = &valueTable[i]; + if (matchedCommands > 0) { + cliPrintLinefeed(); + } cliPrintf("%s = ", valueTable[i].name); cliPrintVar(val, 0); cliPrintLinefeed(); cliPrintVarRange(val); - cliPrintLinefeed(); - + cliPrintVarDefault(val); matchedCommands++; } } From 878418a19c5f58d6ba24cb291c7bdba7dd6302ab Mon Sep 17 00:00:00 2001 From: Neil Balch Date: Mon, 21 May 2018 17:17:30 -0700 Subject: [PATCH 12/24] Updated MATEK F405-CTR Docs Improved formatting and added info on status indicator patterns --- docs/boards/Board - Matek F405-CTR.md | 58 ++++++++++++++------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/docs/boards/Board - Matek F405-CTR.md b/docs/boards/Board - Matek F405-CTR.md index a8afd35947..3a8d85f4a4 100644 --- a/docs/boards/Board - Matek F405-CTR.md +++ b/docs/boards/Board - Matek F405-CTR.md @@ -6,34 +6,36 @@ Full details on the Matek Sys F405-CTR can be found on the Matek Website: [matek * *Mass:* ~10g * *PCB Size:* 36x46mm + * 30x30mm Hole pattern (M4 size, M3 size with rubber isolators) ### FC Specs * Processors and Sensors - * *MCU:* 168MHz STM32F405 - * *IMU:* MPU6000 accelerometer/gyro (via SPI) - * *Baro:* BMP280 (via I2C) - * *OSD:* BetaFlight OSD w/ AT7456E chip + * *MCU:* [STM32F405RGT6](http://www.st.com/content/ccc/resource/technical/document/datasheet/ef/92/76/6d/bb/c2/4f/f7/DM00037051.pdf/files/DM00037051.pdf/jcr:content/translations/en.DM00037051.pdf) + * *IMU:* [MPU6000](https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf) (connected via SPI) + * *Baro:* [BMP280](https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP280-DS001-19.pdf) (connected via I2C) + * *OSD:* BetaFlight OSD (AT7456E IC) * *Blackbox:* MicroSD card slot (SD/SDHC) * 5 UARTs - * Smartaudio & Tramp VTX protocol supported ### Integrated PDB Specs * *Input:* 6-30v (3-6S LiPo) w/TVS protection -* *PDB:* Rated 4x30A per ESC pad set (Max. 4x46A burst) -* *BEC:* 5v 2A continuous load (Max. 3A burst) -* *LDO:* 3.3v: Max load: 300mA for Spektrum RX -* *Current Sensor:* Rated for 184A (*Suggested scale value `179`*) -* *Voltage Sensor:* 1:10 (*Suggested scale value `110`*) +* *ESC Pads:* Rated 4x30A per ESC pad set (4x46A burst) +* Voltage Regulators: + * *5v BEC:* 2A continuous load (3A burst) + * *3.3v LDO:* max load: 300mA +* Power Sense: + * *Current Sensor:* Rated for 184A (*Suggested scale value `179`*) + * *Voltage Sensor:* 1:10 signal output ratio (*Suggested scale value `110`*) ## Status LEDs -| LED | Color | Color Codes | -|------------:|-------|:--------------------------------------| -| FC Status | Blue | *Unknown* | -| FC Status | Red | *Unknown* | -| 3v3 Status | Red | Red: active, Not lit: inactive | +| LED | Color | Color Codes | +|---------------:|-------|:----------------------------------------------------------------------------------------------------------| +| FC Status | Blue | **Unlit:** USB disconnected and disarmed,
**Lit:** USB disconnected and armed,
**Flashing:** USB connected and disarmed,
**5x Rapid Flash then Flashing:** USB connected and arming command prevented | +| Accelerometer | Red | Accelerometer status (Lit: active, Unlit: inactive) | +| 3v3 Status | Red | Red: active, Unlit: inactive | ## Pinout @@ -64,28 +66,28 @@ Pads are organised into two large banks of pads on left and right sides of board | Pad Silkscreen Label | Function | Notes | |---------------------:|---------------|:-----------------------------------------------------------------------------------------------| -| `+ / -` | Battery In | 6-30vDC LiPo Power input (Battery +/- and 4-in-1 ESC +/- pads) | -| `S1-S6` | ESC Out | (1-4 near ESC power connections, 5-6 on front) Supports PWM, Oneshot, Multishot, DSHOT | -| `5V, GND, S1-S4` | ESC Out | (Rear of board) 4-in-1 ESC Out | -| `VBT, GND` | VBT Out | Marked for VTX OSD, but could be used for whatever | -| `CURR` | Current Sense | Current Sensor I/O pin (output from onboard sensor or input from external sensor) | -| `5V` | | Out from internal 5v BEC (rated 2A continuous, 3A burst) | -| `3V3` | | Out from 3v3 regulator (rated 300mA) | -| `4V5` | | Out from 4v4~4v8 regulator (unknown rating, power is also supplied when connected via USB) | +| `+ / -` | Battery In | 6-30vDC LiPo Power input (*Battery +/- and 4-in-1 ESC +/- pads*) | +| `S1-S6` | ESC Out | (*1-4 near ESC power connections, 5-6 on front*) Supports PWM, Oneshot, Multishot, DSHOT | +| `5V, GND, S1-S4` | ESC Out | (*Rear of board*) 4-in-1 ESC Out | +| `VBT, GND` | VBT Out | VBAT power pad (*marked for VTX, but could be used for whatever*) | +| `CURR` | Current Sense | Current Sensor I/O pin (*output from onboard sensor or input from external sensor*) | +| `5V` | | Out from internal 5v BEC (*rated 2A continuous, 3A burst*) | +| `3V3` | | Out from 3v3 regulator (*rated 300mA*) | +| `4V5` | | Out from 4v4~4v8 regulator (*unknown rating, power is also supplied when connected via USB*) | | `G` | GND | | | `LED` | WS2812 Signal | | | `Bz-, 5V` | Buzzer | | | `Rssi` | RSSI | FrSky RSSI input from RX | -| `G, 3V3, SDA, SLC` | I2C | (Rear of board) I2C connection marked for a magnetometer but could be used for whatever | -| `VTX, Cam, DAC` | VTX/CAM | VTX: Video out, Cam: Video in, DAC: Cam control pin (since BF3.3, may be resourced to `S6` ) | +| `G, 3V3, SDA, SLC` | I2C | (*Rear of board*) I2C connection marked for a magnetometer but could be used for whatever | +| `VTX, Cam, DAC` | VTX/CAM | VTX: Video out, Cam: Video in, DAC: Cam control pin (*since BF3.3, may be resourced to `S6`*) | | `RX1, TX1` | UART1 | | | `TX2` | UART2-TX | May be reassigned to `softserial1` for use as FrSky SmartPort pad | -| `RX2` | UART2-RX | RX connection for Spektrum DSMX or DSM2, FlySky iBUS, or PPM (Disable `UART2` for PPM) | -| `Sbus` | SBUS (UART2) | Dedicated pad for SBUS (duplicate pad of `RX2` with signal inverter) | +| `RX2` | UART2-RX | RX connection for Spektrum DSMX or DSM2, FlySky iBUS, or PPM (*Disable `UART2` for PPM*) | +| `Sbus` | SBUS (UART2) | Dedicated pad for SBUS (*duplicate pad of `RX2` with signal inverter*) | | `RX3, TX3` | UART3 | | | `RX4, TX4` | UART4 | | | `RX5, TX5` | UART5 | | -| `RX5` | UART5-RX | (One per board corner) Duplicates of RX5 pad for ESC Telemetry | +| `RX5` | UART5-RX | (*One per board corner*) Duplicates of RX5 pad for ESC Telemetry | ### UARTs + VCP From 40a88ada81969b92e77572b9de66956c81b9bf95 Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Mon, 21 May 2018 21:31:01 -0400 Subject: [PATCH 13/24] Abstracted the PG backup and restore for use in multiple places --- src/main/interface/cli.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/interface/cli.c b/src/main/interface/cli.c index 257cc5e49f..dcb57d331a 100644 --- a/src/main/interface/cli.c +++ b/src/main/interface/cli.c @@ -215,6 +215,16 @@ static const char * const *sensorHardwareNames[] = { }; #endif // USE_SENSOR_NAMES +static void backupPgConfig(const pgRegistry_t *pg) +{ + memcpy(pg->copy, pg->address, pg->size); +} + +static void restorePgConfig(const pgRegistry_t *pg) +{ + memcpy(pg->address, pg->copy, pg->size); +} + static void cliPrint(const char *str) { while (*str) { @@ -3081,7 +3091,7 @@ void cliPrintVarDefault(const clivalue_t *value) if (pg) { const char *defaultFormat = "Default value: "; const int valueOffset = getValueOffset(value); - memcpy(pg->copy, pg->address, pg->size); + backupPgConfig(pg); pgReset(pg); const bool equalsDefault = valuePtrEqualsDefault(value, pg->copy + valueOffset, pg->address + valueOffset); if (!equalsDefault) { @@ -3089,7 +3099,7 @@ void cliPrintVarDefault(const clivalue_t *value) printValuePointer(value, (uint8_t*)pg->address + valueOffset, false); cliPrintLinefeed(); } - memcpy(pg->address, pg->copy, pg->size); + restorePgConfig(pg); } } @@ -3891,7 +3901,7 @@ static void backupConfigs(void) { // make copies of configs to do differencing PG_FOREACH(pg) { - memcpy(pg->copy, pg->address, pg->size); + backupPgConfig(pg); } configIsInCopy = true; @@ -3900,7 +3910,7 @@ static void backupConfigs(void) static void restoreConfigs(void) { PG_FOREACH(pg) { - memcpy(pg->address, pg->copy, pg->size); + restorePgConfig(pg); } configIsInCopy = false; From fd17292843807086589981bd90541b94fe3cf950 Mon Sep 17 00:00:00 2001 From: Andrey Mironov Date: Mon, 14 May 2018 12:41:43 +0300 Subject: [PATCH 14/24] Added M25Q32 Winbond ID --- src/main/drivers/flash_m25p16.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/drivers/flash_m25p16.c b/src/main/drivers/flash_m25p16.c index 5be3af705e..6e0aaaa35a 100644 --- a/src/main/drivers/flash_m25p16.c +++ b/src/main/drivers/flash_m25p16.c @@ -61,6 +61,7 @@ #define JEDEC_ID_MICRON_N25Q064 0x20BA17 #define JEDEC_ID_MICRON_N25Q128 0x20ba18 #define JEDEC_ID_WINBOND_W25Q16 0xEF4015 +#define JEDEC_ID_WINBOND_W25Q32 0xEF4016 #define JEDEC_ID_WINBOND_W25Q64 0xEF4017 #define JEDEC_ID_WINBOND_W25Q128 0xEF4018 #define JEDEC_ID_CYPRESS_S25FL128L 0x016018 @@ -165,6 +166,7 @@ bool m25p16_detect(flashDevice_t *fdevice, uint32_t chipID) fdevice->geometry.sectors = 32; fdevice->geometry.pagesPerSector = 256; break; + case JEDEC_ID_WINBOND_W25Q32: case JEDEC_ID_MACRONIX_MX25L3206E: fdevice->geometry.sectors = 64; fdevice->geometry.pagesPerSector = 256; From eac01a6ad615f931b185e1ae4e2ec87c6d32ecba Mon Sep 17 00:00:00 2001 From: Andrey Mironov Date: Tue, 22 May 2018 12:00:16 +0300 Subject: [PATCH 15/24] Replaced PCRE with egrep for macOS users --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 89b72b53c0..d939fb3db3 100644 --- a/Makefile +++ b/Makefile @@ -477,7 +477,7 @@ test junittest: check-target-independence: $(V1) for test_target in $(VALID_TARGETS); do \ - FOUND=$$(grep -rP "\W$${test_target}\W?" src/main/ | grep -vP "(\/\/)|(\/\*).*\W$${test_target}\W?" | grep -vP "^src/main/target"); \ + FOUND=$$(grep -rE "\W$${test_target}\W?" src/main | grep -vE "(//)|(/\*).*\W$${test_target}\W?" | grep -vE "^src/main/target"); \ if [ "$${FOUND}" != "" ]; then \ echo "Target dependencies found:"; \ echo "$${FOUND}"; \ From 361af53c2bac1be6cf87db011ce9eda26324fb1c Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Tue, 22 May 2018 11:29:04 -0400 Subject: [PATCH 16/24] Refactor to support target specific defaults Also remove redundant call to targetConfiguration() --- src/main/interface/cli.c | 67 +++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/src/main/interface/cli.c b/src/main/interface/cli.c index dcb57d331a..78a9d9f2d8 100644 --- a/src/main/interface/cli.c +++ b/src/main/interface/cli.c @@ -225,6 +225,32 @@ static void restorePgConfig(const pgRegistry_t *pg) memcpy(pg->address, pg->copy, pg->size); } +static void backupConfigs(void) +{ + // make copies of configs to do differencing + PG_FOREACH(pg) { + backupPgConfig(pg); + } + + configIsInCopy = true; +} + +static void restoreConfigs(void) +{ + PG_FOREACH(pg) { + restorePgConfig(pg); + } + + configIsInCopy = false; +} + +static void backupAndResetConfigs(void) +{ + backupConfigs(); + // reset all configs to defaults to do differencing + resetConfigs(); +} + static void cliPrint(const char *str) { while (*str) { @@ -459,7 +485,11 @@ static uint16_t getValueOffset(const clivalue_t *value) void *cliGetValuePointer(const clivalue_t *value) { const pgRegistry_t* rec = pgFind(value->pgn); - return CONST_CAST(void *, rec->address + getValueOffset(value)); + if (configIsInCopy) { + return CONST_CAST(void *, rec->copy + getValueOffset(value)); + } else { + return CONST_CAST(void *, rec->address + getValueOffset(value)); + } } const void *cliGetDefaultPointer(const clivalue_t *value) @@ -3091,15 +3121,12 @@ void cliPrintVarDefault(const clivalue_t *value) if (pg) { const char *defaultFormat = "Default value: "; const int valueOffset = getValueOffset(value); - backupPgConfig(pg); - pgReset(pg); const bool equalsDefault = valuePtrEqualsDefault(value, pg->copy + valueOffset, pg->address + valueOffset); if (!equalsDefault) { cliPrintf(defaultFormat, value->name); printValuePointer(value, (uint8_t*)pg->address + valueOffset, false); cliPrintLinefeed(); } - restorePgConfig(pg); } } @@ -3108,6 +3135,8 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) const clivalue_t *val; int matchedCommands = 0; + backupAndResetConfigs(); + for (uint32_t i = 0; i < valueTableEntryCount; i++) { if (strcasestr(valueTable[i].name, cmdline)) { val = &valueTable[i]; @@ -3123,6 +3152,7 @@ STATIC_UNIT_TESTED void cliGet(char *cmdline) } } + restoreConfigs(); if (matchedCommands) { return; @@ -3897,25 +3927,6 @@ error: } #endif -static void backupConfigs(void) -{ - // make copies of configs to do differencing - PG_FOREACH(pg) { - backupPgConfig(pg); - } - - configIsInCopy = true; -} - -static void restoreConfigs(void) -{ - PG_FOREACH(pg) { - restorePgConfig(pg); - } - - configIsInCopy = false; -} - static void printConfig(char *cmdline, bool doDiff) { uint8_t dumpMask = DUMP_MASTER; @@ -3935,14 +3946,8 @@ static void printConfig(char *cmdline, bool doDiff) if (doDiff) { dumpMask = dumpMask | DO_DIFF; } - - backupConfigs(); - // reset all configs to defaults to do differencing - resetConfigs(); - -#if defined(USE_TARGET_CONFIG) - targetConfiguration(); -#endif + + backupAndResetConfigs(); if (checkCommand(options, "defaults")) { dumpMask = dumpMask | SHOW_DEFAULTS; // add default values as comments for changed values } From c3412225f532d759b0c05a25daea57784a54eb13 Mon Sep 17 00:00:00 2001 From: Diego Basch Date: Mon, 21 May 2018 11:35:40 -0700 Subject: [PATCH 17/24] Fix GPS Rescue (needs yaw smoothing but works). --- src/main/build/debug.c | 1 + src/main/flight/gps_rescue.c | 6 +++--- src/main/interface/msp_box.c | 1 + src/main/io/gps.c | 2 +- src/main/io/osd.c | 2 ++ 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/build/debug.c b/src/main/build/debug.c index bc8556077f..9ad6d60404 100644 --- a/src/main/build/debug.c +++ b/src/main/build/debug.c @@ -68,4 +68,5 @@ const char * const debugModeNames[DEBUG_COUNT] = { "CURRENT_SENSOR", "USB", "SMARTAUDIO", + "RTH", }; diff --git a/src/main/flight/gps_rescue.c b/src/main/flight/gps_rescue.c index 2b18e88954..e7f7fa8e83 100644 --- a/src/main/flight/gps_rescue.c +++ b/src/main/flight/gps_rescue.c @@ -164,7 +164,6 @@ void updateGPSRescueState(void) } newGPSData = false; - } void sensorUpdate() @@ -304,6 +303,7 @@ void rescueAttainPosition() return; } + /** Speed controller */ @@ -363,8 +363,8 @@ void setBearing(int16_t deg) dif -= 360; dif *= -GET_DIRECTION(rcControlsConfig()->yaw_control_reversed); - - rcCommand[YAW] -= dif * gpsRescue()->yawP / 4; + dif = constrain(dif, -5, 5); // TODO: very basic smoothing, we need something less twitchy + rcCommand[YAW] -= dif * gpsRescue()->yawP / 20; } #endif diff --git a/src/main/interface/msp_box.c b/src/main/interface/msp_box.c index b3639ee95f..0060f87db7 100644 --- a/src/main/interface/msp_box.c +++ b/src/main/interface/msp_box.c @@ -196,6 +196,7 @@ void initActiveBoxIds(void) if (feature(FEATURE_GPS)) { BME(BOXGPSHOME); BME(BOXGPSHOLD); + BME(BOXGPSRESCUE); BME(BOXBEEPGPSCOUNT); } #endif diff --git a/src/main/io/gps.c b/src/main/io/gps.c index d7a3c38a0c..f5732a661a 100644 --- a/src/main/io/gps.c +++ b/src/main/io/gps.c @@ -243,7 +243,7 @@ PG_RESET_TEMPLATE(gpsRescue_t, gpsRescue, .velP = 80, .velI = 20, .velD = 15, - .yawP = 15, + .yawP = 40, .throttleMin = 1200, .throttleMax = 1600, .throttleHover = 1280, diff --git a/src/main/io/osd.c b/src/main/io/osd.c index b3a85f1b0f..b8b4fd5b23 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -548,6 +548,8 @@ static bool osdDrawSingleElement(uint8_t item) strcpy(buff, "STAB"); } else if (FLIGHT_MODE(HORIZON_MODE)) { strcpy(buff, "HOR "); + } else if (FLIGHT_MODE(GPS_RESCUE_MODE)) { + strcpy(buff, "RESC"); } else if (isAirmodeActive()) { strcpy(buff, "AIR "); } else { From d79fbf2938cc05a6d44862be26114c1ae1b97f4d Mon Sep 17 00:00:00 2001 From: Cheng Lin Date: Mon, 7 May 2018 17:48:39 +0800 Subject: [PATCH 18/24] change CLRACINGF7 target to use DMAR burst change CLRACINGF7 to one timer and flash chip test flash Update CLRACINGF7 TARGET update the file copyright --- src/main/target/BETAFLIGHTF4/target.mk | 2 +- src/main/target/CLRACINGF7/CL_RACINGF7.md | 4 +- src/main/target/CLRACINGF7/target.c | 17 ++--- src/main/target/CLRACINGF7/target.h | 81 +++++++++++------------ src/main/target/CLRACINGF7/target.mk | 4 +- 5 files changed, 49 insertions(+), 59 deletions(-) diff --git a/src/main/target/BETAFLIGHTF4/target.mk b/src/main/target/BETAFLIGHTF4/target.mk index 0db7894474..59f3ba282b 100644 --- a/src/main/target/BETAFLIGHTF4/target.mk +++ b/src/main/target/BETAFLIGHTF4/target.mk @@ -1,6 +1,6 @@ F405_TARGETS += $(TARGET) -FEATURES += VCP ONBOARDFLASH +FEATURES += VCP ONBOARDFLASH SDCARD TARGET_SRC = \ drivers/accgyro/accgyro_mpu.c \ diff --git a/src/main/target/CLRACINGF7/CL_RACINGF7.md b/src/main/target/CLRACINGF7/CL_RACINGF7.md index a7ed8267d5..ab6f092224 100644 --- a/src/main/target/CLRACINGF7/CL_RACINGF7.md +++ b/src/main/target/CLRACINGF7/CL_RACINGF7.md @@ -1,9 +1,9 @@ MCU: STM32F722RE -IMU: MPU-6000 +IMU: ICM-20602 IMU Interrupt: yes BARO: NO VCP: YES -Hardware UARTS: +Hardware UARTS: 6 uarts OSD: uses a AB7456 chip Blackbox: SD Card PPM/UART NOT Shared: YES diff --git a/src/main/target/CLRACINGF7/target.c b/src/main/target/CLRACINGF7/target.c index ebc6e9ba39..b2e89979f4 100644 --- a/src/main/target/CLRACINGF7/target.c +++ b/src/main/target/CLRACINGF7/target.c @@ -17,7 +17,6 @@ * * If not, see . */ - #include #include @@ -27,20 +26,16 @@ #include "drivers/timer.h" #include "drivers/timer_def.h" -// DSHOT will work for motor 1-6. - const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = { - DEF_TIM(TIM10, CH1, PB8, TIM_USE_ANY, 0, 0), // USE FOR CAMERA CONTROL + DEF_TIM(TIM2, CH2, PB3, TIM_USE_ANY, 0, 0), // USE FOR CAMERA CONTROL - DEF_TIM(TIM2, CH4, PA3, TIM_USE_MOTOR, 0, 1), // PWM1 - DMA1_ST6 D(1, 7, 3),D(1, 6, 3) - DEF_TIM(TIM8, CH3, PC8, TIM_USE_MOTOR, 0, 1), // PWM2 - DMA2_ST2 D(2, 4, 7),D(2, 2, 0) - DEF_TIM(TIM2, CH3, PA2, TIM_USE_MOTOR, 0, 0), // PWM3 - DMA1_ST1 D(1, 1, 3) - DEF_TIM(TIM8, CH4, PC9, TIM_USE_MOTOR, 0, 0), // PWM4 - DMA1_ST2 D(1, 2, 5) - DEF_TIM(TIM1, CH1, PA8, TIM_USE_MOTOR, 0, 2), // PWM5 - DMA2_ST3 D(2, 6, 0),D(2, 1, 6),D(2, 3, 6) - DEF_TIM(TIM4, CH1, PB6, TIM_USE_MOTOR, 0, 0), // PWM6 - DMA1_ST0 D(1, 0, 2) + DEF_TIM(TIM4, CH1, PB6, TIM_USE_MOTOR, 0, 0), // D1-ST6 + DEF_TIM(TIM4, CH2, PB7, TIM_USE_MOTOR, 0, 0), // D1-ST6 + DEF_TIM(TIM4, CH3, PB8, TIM_USE_MOTOR, 0, 0), // D1-ST6 + DEF_TIM(TIM4, CH4, PB9, TIM_USE_MOTOR, 0, 0), // D1-ST6 - DEF_TIM(TIM1, CH3N, PB1, TIM_USE_MOTOR | TIM_USE_LED, 0, 0), // S5_OUT - DMA2_ST6 D(2, 6, 0),D(2, 6, 6) + DEF_TIM(TIM3, CH4, PB1, TIM_USE_MOTOR | TIM_USE_LED, 0, 0), // D1-ST2 }; diff --git a/src/main/target/CLRACINGF7/target.h b/src/main/target/CLRACINGF7/target.h index ab3673daba..bae20e3641 100644 --- a/src/main/target/CLRACINGF7/target.h +++ b/src/main/target/CLRACINGF7/target.h @@ -20,32 +20,21 @@ #pragma once #define TARGET_BOARD_IDENTIFIER "CLR7" - #define USBD_PRODUCT_STRING "CLRACINGF7" #define ENABLE_DSHOT_DMAR true #define LED0_PIN PB0 #define USE_BEEPER -#define BEEPER_PIN PB4 +#define BEEPER_PIN PB4 #define BEEPER_INVERTED //define camera control -#define CAMERA_CONTROL_PIN PB8 +#define CAMERA_CONTROL_PIN PB3 #define USE_EXTI #define MPU_INT_EXTI PC4 #define USE_MPU_DATA_READY_SIGNAL -//ICM20689 -#define ICM20689_CS_PIN PA4 -#define ICM20689_SPI_INSTANCE SPI1 -#define USE_GYRO -#define USE_GYRO_SPI_ICM20689 -#define GYRO_ICM20689_ALIGN CW0_DEG -#define USE_ACC -#define USE_ACC_SPI_ICM20689 -#define ACC_ICM20689_ALIGN CW0_DEG - //MPU-6000 #define USE_ACC #define USE_ACC_SPI_MPU6000 @@ -73,24 +62,33 @@ #define MAX7456_SPI_CS_PIN PA15 #define MAX7456_SPI_CLK (SPI_CLOCK_STANDARD) // 10MHz #define MAX7456_RESTORE_CLK (SPI_CLOCK_FAST) +//define use flash +#define FLASH_CS_PIN PB12 +#define FLASH_SPI_INSTANCE SPI2 +#define USE_FLASHFS +#define USE_FLASH_M25P16 +//define use SD card #define USE_SDCARD -#define SDCARD_DETECT_PIN PB7 +#define SDCARD_DETECT_PIN PA8 #define SDCARD_SPI_INSTANCE SPI2 -#define SDCARD_SPI_CS_PIN SPI2_NSS_PIN - +#define SDCARD_SPI_CS_PIN SPI2_NSS_PIN #define SDCARD_SPI_INITIALIZATION_CLOCK_DIVIDER 256 // 422kHz // Divide to under 25MHz for normal operation: -#define SDCARD_SPI_FULL_SPEED_CLOCK_DIVIDER 8 // 27MHz - +#define SDCARD_SPI_FULL_SPEED_CLOCK_DIVIDER 8 // 27MHz #define SDCARD_DMA_STREAM_TX_FULL DMA1_Stream4 #define SDCARD_DMA_CHANNEL 0 #define USE_VCP + #define USE_UART1 #define UART1_RX_PIN PA10 #define UART1_TX_PIN PA9 +#define USE_UART2 +#define UART2_RX_PIN PA3 +#define UART2_TX_PIN PA2 + #define USE_UART3 #define UART3_RX_PIN PB11 #define UART3_TX_PIN PB10 @@ -99,39 +97,39 @@ #define UART4_RX_PIN PA1 #define UART4_TX_PIN PA0 +#define USE_UART5 +#define UART5_RX_PIN PD2 +#define UART5_TX_PIN PC12 + #define USE_UART6 #define UART6_RX_PIN PC7 #define UART6_TX_PIN PC6 -#define USE_SOFTSERIAL1 - -#define SERIAL_PORT_COUNT 6 //VCP, USART1, USART3,USART4, USART6, SOFT_SERIAL1 +//#define USE_SOFTSERIAL1 +#define SERIAL_PORT_COUNT 7 //VCP, USART1, USART2,USART3,USART4,USART5,USART6 #define USE_ESCSERIAL #define ESCSERIAL_TIMER_TX_PIN PB8 // (Hardware=0, PPM) -// XXX To target maintainer: Bus device to configure must be specified. -//#define USE_I2C - #define USE_SPI #define USE_SPI_DEVICE_1 #define USE_SPI_DEVICE_2 #define USE_SPI_DEVICE_3 -#define SPI1_NSS_PIN PA4 -#define SPI1_SCK_PIN PA5 -#define SPI1_MISO_PIN PA6 -#define SPI1_MOSI_PIN PA7 +#define SPI1_NSS_PIN PA4 +#define SPI1_SCK_PIN PA5 +#define SPI1_MISO_PIN PA6 +#define SPI1_MOSI_PIN PA7 -#define SPI2_NSS_PIN PB12 -#define SPI2_SCK_PIN PB13 -#define SPI2_MISO_PIN PB14 -#define SPI2_MOSI_PIN PB15 +#define SPI2_NSS_PIN PB12 +#define SPI2_SCK_PIN PB13 +#define SPI2_MISO_PIN PB14 +#define SPI2_MOSI_PIN PB15 -#define SPI3_NSS_PIN PA15 -#define SPI3_SCK_PIN PC10 -#define SPI3_MISO_PIN PC11 -#define SPI3_MOSI_PIN PC12 +#define SPI3_NSS_PIN PA15 +#define SPI3_SCK_PIN PC10 +#define SPI3_MISO_PIN PC11 +#define SPI3_MOSI_PIN PB5 #define USE_ADC #define DEFAULT_VOLTAGE_METER_SOURCE VOLTAGE_METER_ADC @@ -142,17 +140,16 @@ #define CURRENT_METER_SCALE_DEFAULT 250 // 3.3/120A = 25mv/A #define BINDPLUG_PIN PB2 -#define ENABLE_BLACKBOX_LOGGING_ON_SDCARD_BY_DEFAULT +#define ENABLE_BLACKBOX_LOGGING_ON_SPIFLASH_BY_DEFAULT #define DEFAULT_RX_FEATURE FEATURE_RX_SERIAL -#define SERIALRX_UART SERIAL_PORT_USART6 -#define TELEMETRY_UART SERIAL_PORT_USART1 -#define USE_SERIAL_4WAY_BLHELI_INTERFACE +#define SERIALRX_UART SERIAL_PORT_UART5 +#define USE_SERIAL_4WAY_BLHELI_INTERFACE #define TARGET_IO_PORTA 0xffff #define TARGET_IO_PORTB 0xffff #define TARGET_IO_PORTC 0xffff #define TARGET_IO_PORTD (BIT(2)) -#define USABLE_TIMER_CHANNEL_COUNT 9 -#define USED_TIMERS ( TIM_N(1) | TIM_N(2) | TIM_N(3) | TIM_N(4) | TIM_N(8) | TIM_N(10) ) +#define USABLE_TIMER_CHANNEL_COUNT 6 +#define USED_TIMERS ( TIM_N(2) | TIM_N(3) | TIM_N(4) ) diff --git a/src/main/target/CLRACINGF7/target.mk b/src/main/target/CLRACINGF7/target.mk index ab85a4ba98..2f2f023cd6 100644 --- a/src/main/target/CLRACINGF7/target.mk +++ b/src/main/target/CLRACINGF7/target.mk @@ -1,12 +1,10 @@ F7X2RE_TARGETS += $(TARGET) -FEATURES += SDCARD VCP +FEATURES += VCP ONBOARDFLASH SDCARD TARGET_SRC = \ drivers/accgyro/accgyro_mpu.c \ - drivers/accgyro/accgyro_spi_icm20689.c\ drivers/accgyro/accgyro_mpu6500.c \ drivers/accgyro/accgyro_spi_mpu6500.c \ drivers/accgyro/accgyro_spi_mpu6000.c \ drivers/light_ws2811strip.c \ drivers/light_ws2811strip_hal.c \ drivers/max7456.c - From f06d7173098a1b8294fee3120e1c04b9966b43a4 Mon Sep 17 00:00:00 2001 From: s0up Date: Tue, 22 May 2018 17:00:28 -0700 Subject: [PATCH 19/24] fix the requirement for easing on yaw changes by only changing relative to 0 --- src/main/flight/gps_rescue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/flight/gps_rescue.c b/src/main/flight/gps_rescue.c index e7f7fa8e83..890a838f8a 100644 --- a/src/main/flight/gps_rescue.c +++ b/src/main/flight/gps_rescue.c @@ -363,8 +363,8 @@ void setBearing(int16_t deg) dif -= 360; dif *= -GET_DIRECTION(rcControlsConfig()->yaw_control_reversed); - dif = constrain(dif, -5, 5); // TODO: very basic smoothing, we need something less twitchy - rcCommand[YAW] -= dif * gpsRescue()->yawP / 20; + + rcCommand[YAW] = - (dif * gpsRescue()->yawP / 20); } #endif From 09ed26f2ffe229b9a0a0a54f067bc568b886b133 Mon Sep 17 00:00:00 2001 From: ZhengNingwei Date: Wed, 23 May 2018 15:31:39 +0800 Subject: [PATCH 20/24] Add new target FOXEERF405 Board - FOXEERF405 This board use the STM32F405RGT6 microcontroller and have the following features: * 1024K bytes of flash memory,192K bytes RAM,168 MHz CPU/210 DMIPS * The 16M byte SPI flash for data logging * USB VCP and boot select button on board(for DFU) * Stable voltage regulation,9V/2A DCDC BEC for VTX/camera etc.And could select 5v/9v with pad * Serial LED interface(LED_STRIP) * VBAT/CURR/RSSI sensors input * Suppose IRC Tramp/smart audio/FPV Camera Control/FPORT/telemetry * Supports SBus, Spektrum1024/2048, PPM. No external inverters required (built-in). * Supports I2C device extend(baro/compass/OLED etc) * Supports GPS * Supports MPU6000 or ICM20689 --- docs/boards/Board - FOXEERF405.md | 21 ++++ src/main/target/FOXEERF405/target.c | 45 ++++++++ src/main/target/FOXEERF405/target.h | 164 +++++++++++++++++++++++++++ src/main/target/FOXEERF405/target.mk | 11 ++ 4 files changed, 241 insertions(+) create mode 100644 docs/boards/Board - FOXEERF405.md create mode 100644 src/main/target/FOXEERF405/target.c create mode 100644 src/main/target/FOXEERF405/target.h create mode 100644 src/main/target/FOXEERF405/target.mk diff --git a/docs/boards/Board - FOXEERF405.md b/docs/boards/Board - FOXEERF405.md new file mode 100644 index 0000000000..dc83520bf2 --- /dev/null +++ b/docs/boards/Board - FOXEERF405.md @@ -0,0 +1,21 @@ +# Board - FOXEERF405 + +The FOXEERF405 described here: + +This board use the STM32F405RGT6 microcontroller and have the following features: +* 1024K bytes of flash memory,192K bytes RAM,168 MHz CPU/210 DMIPS +* The 16M byte SPI flash for data logging +* USB VCP and boot select button on board(for DFU) +* Stable voltage regulation,9V/2A DCDC BEC for VTX/camera etc.And could select 5v/9v with pad +* Serial LED interface(LED_STRIP) +* VBAT/CURR/RSSI sensors input +* Suppose IRC Tramp/smart audio/FPV Camera Control/FPORT/telemetry +* Supports SBus, Spektrum1024/2048, PPM. No external inverters required (built-in). +* Supports I2C device extend(baro/compass/OLED etc) +* Supports GPS +* Supports MPU6000 or ICM20689 + + + + + diff --git a/src/main/target/FOXEERF405/target.c b/src/main/target/FOXEERF405/target.c new file mode 100644 index 0000000000..dc48fd930e --- /dev/null +++ b/src/main/target/FOXEERF405/target.c @@ -0,0 +1,45 @@ +/* + * This file is part of Cleanflight and Betaflight. + * + * Cleanflight and Betaflight are free software. You can redistribute + * this software and/or modify this software under the terms of the + * GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * Cleanflight and Betaflight are distributed in the hope that they + * will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software. + * + * If not, see . + */ + +#include + +#include +#include "drivers/io.h" + +#include "drivers/dma.h" +#include "drivers/timer.h" +#include "drivers/timer_def.h" + +const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = { + DEF_TIM(TIM12, CH2, PB15, TIM_USE_PPM, 0, 0), // PPM + + DEF_TIM(TIM3, CH3, PB0, TIM_USE_MOTOR, 0, 0), // S1 (1,7) + DEF_TIM(TIM3, CH1, PB4, TIM_USE_MOTOR, 0, 0), // S2 (1,4) + DEF_TIM(TIM8, CH3, PC8, TIM_USE_MOTOR, 0, 0), // S3 (2,4) + DEF_TIM(TIM8, CH4, PC9, TIM_USE_MOTOR, 0, 0), // S4 (2,7) + DEF_TIM(TIM8, CH1, PC6, TIM_USE_MOTOR, 0, 0), // S5 (2,2) + DEF_TIM(TIM8, CH2, PC7, TIM_USE_MOTOR, 0, 0), // S6 (2,3) + + + DEF_TIM(TIM1, CH3, PA10, TIM_USE_LED, 0, 0), // LED STRIP(2,6) + + DEF_TIM(TIM2, CH2, PB3, TIM_USE_PWM, 0, 0), // FC CAM + +}; diff --git a/src/main/target/FOXEERF405/target.h b/src/main/target/FOXEERF405/target.h new file mode 100644 index 0000000000..2f9cb2ab57 --- /dev/null +++ b/src/main/target/FOXEERF405/target.h @@ -0,0 +1,164 @@ +/* + * This file is part of Cleanflight and Betaflight. + * + * Cleanflight and Betaflight are free software. You can redistribute + * this software and/or modify this software under the terms of the + * GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * Cleanflight and Betaflight are distributed in the hope that they + * will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software. + * + * If not, see . + */ + +#pragma once + +#define TARGET_BOARD_IDENTIFIER "FXF4" +#define USBD_PRODUCT_STRING "FOXEERF405" +//---------------------------------------- + +//LED & BEE------------------------------- +#define LED0_PIN PC15 + +#define USE_BEEPER +#define BEEPER_PIN PA4 +#define BEEPER_INVERTED + +//define camera control +#define CAMERA_CONTROL_PIN PB3 + +//Gyro & ACC------------------------------- +#define USE_SPI +#define USE_SPI_DEVICE_1 + +#define SPI1_SCK_PIN PA5 +#define SPI1_MISO_PIN PA6 +#define SPI1_MOSI_PIN PA7 + +#define USE_EXTI +#define MPU_INT_EXTI PC4 +#define USE_MPU_DATA_READY_SIGNAL + +#define USE_GYRO +#define USE_ACC +//------ICM20689 +#define ICM20689_CS_PIN PB2 +#define ICM20689_SPI_INSTANCE SPI1 + +#define USE_GYRO_SPI_ICM20689 +#define GYRO_ICM20689_ALIGN CW90_DEG + +#define USE_ACC_SPI_ICM20689 +#define ACC_ICM20689_ALIGN CW90_DEG +//------MPU6000 +#define MPU6000_CS_PIN PB2 +#define MPU6000_SPI_INSTANCE SPI1 + +#define USE_GYRO_SPI_MPU6000 +#define GYRO_MPU6000_ALIGN CW90_DEG + +#define USE_ACC_SPI_MPU6000 +#define ACC_MPU6000_ALIGN CW90_DEG + +//Baro & MAG------------------------------- +#define USE_I2C +#define USE_I2C_DEVICE_1 +#define I2C_DEVICE (I2CDEV_1) +#define I2C1_SCL PB8 +#define I2C1_SDA PB9 + +//ON BOARD FLASH ----------------------------------- +#define USE_SPI_DEVICE_2 +#define SPI2_SCK_PIN PB13 +#define SPI2_MISO_PIN PB14 +#define SPI2_MOSI_PIN PC3 + +#define ENABLE_BLACKBOX_LOGGING_ON_SPIFLASH_BY_DEFAULT +#define USE_FLASHFS +#define USE_FLASH_M25P16 +#define M25P16_CS_PIN PB12 +#define M25P16_SPI_INSTANCE SPI2 + +//GPS ---------------------------------------------- +#define USE_GPS +#define USE_GPS_UBLOX +#define USE_GPS_NMEA +//OSD ---------------------------------------------- +#define USE_SPI_DEVICE_3 +#define SPI3_SCK_PIN PC10 +#define SPI3_MISO_PIN PC11 +#define SPI3_MOSI_PIN PB5 + +#define USE_OSD +#define USE_MAX7456 +#define MAX7456_SPI_INSTANCE SPI3 +#define MAX7456_SPI_CS_PIN PA15 + +//UART ---------------------------------------------- +#define USE_VCP + +#define USE_UART1 +#define UART1_RX_PIN PB7 +#define UART1_TX_PIN PA9 + +#define USE_UART2 +#define UART2_RX_PIN PA3 +#define UART2_TX_PIN PA2 + +#define USE_UART3 +#define UART3_RX_PIN PB11 +#define UART3_TX_PIN PB10 + +#define USE_UART4 +#define UART4_RX_PIN PA1 +#define UART4_TX_PIN PA0 + +#define USE_UART5 +#define UART5_RX_PIN PD2 +#define UART5_TX_PIN PC12 + +#define USE_SOFTSERIAL1 +#define USE_SOFTSERIAL2 + +#define SERIAL_PORT_COUNT 8 + +#define DEFAULT_RX_FEATURE FEATURE_RX_SERIAL +#define SERIALRX_PROVIDER SERIALRX_SBUS + +//ADC ---------------------------------------------- +#define USE_ADC +#define ADC1_DMA_STREAM DMA2_Stream0 +#define VBAT_ADC_PIN PC0 +#define CURRENT_METER_ADC_PIN PC1 +#define RSSI_ADC_PIN PA0 //TIM5_CH1 & UART4_TX & TELEMETRY & FPORT + +#define DEFAULT_VOLTAGE_METER_SOURCE VOLTAGE_METER_ADC +#define DEFAULT_CURRENT_METER_SOURCE CURRENT_METER_ADC + +#define CURRENT_METER_SCALE_DEFAULT 166 + +#define ENABLE_DSHOT_DMAR true + +#define USE_ESCSERIAL +#define ESCSERIAL_TIMER_TX_PIN PA3 +#define USE_SERIAL_4WAY_BLHELI_INTERFACE + + +#define TARGET_IO_PORTA 0xffff +#define TARGET_IO_PORTB 0xffff +#define TARGET_IO_PORTC 0xffff +#define TARGET_IO_PORTD (BIT(2)) + + +#define USABLE_TIMER_CHANNEL_COUNT 9 +#define USED_TIMERS (TIM_N(1)|TIM_N(2)|TIM_N(3)|TIM_N(4)|TIM_N(8)|TIM_N(12)) + + + diff --git a/src/main/target/FOXEERF405/target.mk b/src/main/target/FOXEERF405/target.mk new file mode 100644 index 0000000000..4cf5fd8939 --- /dev/null +++ b/src/main/target/FOXEERF405/target.mk @@ -0,0 +1,11 @@ +F405_TARGETS += $(TARGET) +FEATURES += VCP ONBOARDFLASH +TARGET_SRC = \ + drivers/accgyro/accgyro_spi_icm20689.c \ + drivers/accgyro/accgyro_spi_mpu6000.c \ + drivers/barometer/barometer_bmp085.c \ + drivers/barometer/barometer_bmp280.c \ + drivers/barometer/barometer_ms5611.c \ + drivers/compass/compass_hmc5883l.c \ + drivers/max7456.c + From 1baacd30058125b96a02f356cdafdab9b86bed52 Mon Sep 17 00:00:00 2001 From: nyway Date: Wed, 23 May 2018 16:38:12 +0800 Subject: [PATCH 21/24] Update target.h Delete TIM4 in USED_TIMERS list --- src/main/target/FOXEERF405/target.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/target/FOXEERF405/target.h b/src/main/target/FOXEERF405/target.h index 2f9cb2ab57..d7c98f3a2a 100644 --- a/src/main/target/FOXEERF405/target.h +++ b/src/main/target/FOXEERF405/target.h @@ -158,7 +158,7 @@ #define USABLE_TIMER_CHANNEL_COUNT 9 -#define USED_TIMERS (TIM_N(1)|TIM_N(2)|TIM_N(3)|TIM_N(4)|TIM_N(8)|TIM_N(12)) +#define USED_TIMERS (TIM_N(1)|TIM_N(2)|TIM_N(3)|TIM_N(8)|TIM_N(12)) From be114943446e64c0d1e2ffeb61d732bde9acf9f4 Mon Sep 17 00:00:00 2001 From: nyway Date: Wed, 23 May 2018 18:07:27 +0800 Subject: [PATCH 22/24] Update target.h Changed to FLASH_CS_PIN and FLASH_SPI_INSTANCE --- src/main/target/FOXEERF405/target.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/target/FOXEERF405/target.h b/src/main/target/FOXEERF405/target.h index d7c98f3a2a..f627c18782 100644 --- a/src/main/target/FOXEERF405/target.h +++ b/src/main/target/FOXEERF405/target.h @@ -83,8 +83,8 @@ #define ENABLE_BLACKBOX_LOGGING_ON_SPIFLASH_BY_DEFAULT #define USE_FLASHFS #define USE_FLASH_M25P16 -#define M25P16_CS_PIN PB12 -#define M25P16_SPI_INSTANCE SPI2 +#define FLASH_CS_PIN PB12 +#define FLASH_SPI_INSTANCE SPI2 //GPS ---------------------------------------------- #define USE_GPS From d8dd6f29f8324648e55824bd80842f898f5a3b23 Mon Sep 17 00:00:00 2001 From: Andrey Mironov Date: Tue, 22 May 2018 09:30:33 +0300 Subject: [PATCH 23/24] Set FAST_RAM to go into .fastram_data by default. Added FAST_RAM_NOINIT --- src/main/drivers/pwm_output.c | 10 ++-- src/main/drivers/pwm_output_dshot_hal.c | 6 +-- src/main/drivers/serial_uart_pinconfig.c | 4 +- src/main/fc/fc_init.c | 2 +- src/main/flight/mixer.c | 28 +++++------ src/main/flight/pid.c | 64 ++++++++++++------------ src/main/scheduler/scheduler.c | 16 +++--- src/main/sensors/acceleration.c | 2 +- src/main/sensors/gyro.c | 18 +++---- src/main/sensors/gyroanalyse.c | 26 +++++----- src/main/target/common_fc_pre.h | 6 +-- src/main/target/common_osd_slave.h | 1 + src/test/unit/platform.h | 2 +- 13 files changed, 93 insertions(+), 92 deletions(-) diff --git a/src/main/drivers/pwm_output.c b/src/main/drivers/pwm_output.c index 7c88bf57d9..7578b2ecb6 100644 --- a/src/main/drivers/pwm_output.c +++ b/src/main/drivers/pwm_output.c @@ -31,12 +31,12 @@ #include "timer.h" #include "drivers/pwm_output.h" -static FAST_RAM pwmWriteFn *pwmWrite; -static FAST_RAM pwmOutputPort_t motors[MAX_SUPPORTED_MOTORS]; -static FAST_RAM pwmCompleteWriteFn *pwmCompleteWrite = NULL; +static FAST_RAM_ZERO_INIT pwmWriteFn *pwmWrite; +static FAST_RAM_ZERO_INIT pwmOutputPort_t motors[MAX_SUPPORTED_MOTORS]; +static FAST_RAM_ZERO_INIT pwmCompleteWriteFn *pwmCompleteWrite = NULL; #ifdef USE_DSHOT -FAST_RAM loadDmaBufferFn *loadDmaBuffer; +FAST_RAM_ZERO_INIT loadDmaBufferFn *loadDmaBuffer; #endif #ifdef USE_SERVOS @@ -51,7 +51,7 @@ static uint16_t freqBeep = 0; static bool pwmMotorsEnabled = false; static bool isDshot = false; #ifdef USE_DSHOT_DMAR -FAST_RAM bool useBurstDshot = false; +FAST_RAM_ZERO_INIT bool useBurstDshot = false; #endif static void pwmOCConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t value, uint8_t output) diff --git a/src/main/drivers/pwm_output_dshot_hal.c b/src/main/drivers/pwm_output_dshot_hal.c index 74e6306e99..8e36a8ebd7 100644 --- a/src/main/drivers/pwm_output_dshot_hal.c +++ b/src/main/drivers/pwm_output_dshot_hal.c @@ -33,9 +33,9 @@ #include "dma.h" #include "rcc.h" -static FAST_RAM uint8_t dmaMotorTimerCount = 0; -static FAST_RAM motorDmaTimer_t dmaMotorTimers[MAX_DMA_TIMERS]; -static FAST_RAM motorDmaOutput_t dmaMotors[MAX_SUPPORTED_MOTORS]; +static FAST_RAM_ZERO_INIT uint8_t dmaMotorTimerCount = 0; +static FAST_RAM_ZERO_INIT motorDmaTimer_t dmaMotorTimers[MAX_DMA_TIMERS]; +static FAST_RAM_ZERO_INIT motorDmaOutput_t dmaMotors[MAX_SUPPORTED_MOTORS]; motorDmaOutput_t *getMotorDmaOutput(uint8_t index) { diff --git a/src/main/drivers/serial_uart_pinconfig.c b/src/main/drivers/serial_uart_pinconfig.c index 5b4c22f839..d9d6f9ad90 100644 --- a/src/main/drivers/serial_uart_pinconfig.c +++ b/src/main/drivers/serial_uart_pinconfig.c @@ -39,8 +39,8 @@ #include "drivers/serial_uart.h" #include "drivers/serial_uart_impl.h" -FAST_RAM uartDevice_t uartDevice[UARTDEV_COUNT]; // Only those configured in target.h -FAST_RAM uartDevice_t *uartDevmap[UARTDEV_COUNT_MAX]; // Full array +FAST_RAM_ZERO_INIT uartDevice_t uartDevice[UARTDEV_COUNT]; // Only those configured in target.h +FAST_RAM_ZERO_INIT uartDevice_t *uartDevmap[UARTDEV_COUNT_MAX]; // Full array void uartPinConfigure(const serialPinConfig_t *pSerialPinConfig) { diff --git a/src/main/fc/fc_init.c b/src/main/fc/fc_init.c index 4ddaf906d0..6eea859390 100644 --- a/src/main/fc/fc_init.c +++ b/src/main/fc/fc_init.c @@ -275,7 +275,7 @@ void init(void) #endif #ifdef USE_FAST_RAM - /* Load FAST_RAM_INITIALIZED variable intializers into FAST RAM */ + /* Load FAST_RAM variable intializers into DTCM RAM */ extern uint8_t _sfastram_data; extern uint8_t _efastram_data; extern uint8_t _sfastram_idata; diff --git a/src/main/flight/mixer.c b/src/main/flight/mixer.c index af857fe772..bc4d94764e 100644 --- a/src/main/flight/mixer.c +++ b/src/main/flight/mixer.c @@ -115,10 +115,10 @@ PG_REGISTER_ARRAY(motorMixer_t, MAX_SUPPORTED_MOTORS, customMotorMixer, PG_MOTOR #define PWM_RANGE_MID 1500 -static FAST_RAM uint8_t motorCount; -static FAST_RAM float motorMixRange; +static FAST_RAM_ZERO_INIT uint8_t motorCount; +static FAST_RAM_ZERO_INIT float motorMixRange; -float FAST_RAM motor[MAX_SUPPORTED_MOTORS]; +float FAST_RAM_ZERO_INIT motor[MAX_SUPPORTED_MOTORS]; float motor_disarmed[MAX_SUPPORTED_MOTORS]; mixerMode_e currentMixerMode; @@ -313,12 +313,12 @@ const mixer_t mixers[] = { }; #endif // !USE_QUAD_MIXER_ONLY -FAST_RAM float motorOutputHigh, motorOutputLow; +FAST_RAM_ZERO_INIT float motorOutputHigh, motorOutputLow; -static FAST_RAM float disarmMotorOutput, deadbandMotor3dHigh, deadbandMotor3dLow; -static FAST_RAM uint16_t rcCommand3dDeadBandLow; -static FAST_RAM uint16_t rcCommand3dDeadBandHigh; -static FAST_RAM float rcCommandThrottleRange, rcCommandThrottleRange3dLow, rcCommandThrottleRange3dHigh; +static FAST_RAM_ZERO_INIT float disarmMotorOutput, deadbandMotor3dHigh, deadbandMotor3dLow; +static FAST_RAM_ZERO_INIT uint16_t rcCommand3dDeadBandLow; +static FAST_RAM_ZERO_INIT uint16_t rcCommand3dDeadBandHigh; +static FAST_RAM_ZERO_INIT float rcCommandThrottleRange, rcCommandThrottleRange3dLow, rcCommandThrottleRange3dHigh; uint8_t getMotorCount(void) { @@ -519,12 +519,12 @@ void stopPwmAllMotors(void) delayMicroseconds(1500); } -static FAST_RAM float throttle = 0; -static FAST_RAM float motorOutputMin; -static FAST_RAM float motorRangeMin; -static FAST_RAM float motorRangeMax; -static FAST_RAM float motorOutputRange; -static FAST_RAM int8_t motorOutputMixSign; +static FAST_RAM_ZERO_INIT float throttle = 0; +static FAST_RAM_ZERO_INIT float motorOutputMin; +static FAST_RAM_ZERO_INIT float motorRangeMin; +static FAST_RAM_ZERO_INIT float motorRangeMax; +static FAST_RAM_ZERO_INIT float motorOutputRange; +static FAST_RAM_ZERO_INIT int8_t motorOutputMixSign; static void calculateThrottleAndCurrentMotorEndpoints(timeUs_t currentTimeUs) { diff --git a/src/main/flight/pid.c b/src/main/flight/pid.c index 10859b5dcc..0292d2c28e 100644 --- a/src/main/flight/pid.c +++ b/src/main/flight/pid.c @@ -56,14 +56,14 @@ #include "sensors/acceleration.h" -FAST_RAM uint32_t targetPidLooptime; -FAST_RAM pidAxisData_t pidData[XYZ_AXIS_COUNT]; +FAST_RAM_ZERO_INIT uint32_t targetPidLooptime; +FAST_RAM_ZERO_INIT pidAxisData_t pidData[XYZ_AXIS_COUNT]; -static FAST_RAM bool pidStabilisationEnabled; +static FAST_RAM_ZERO_INIT bool pidStabilisationEnabled; -static FAST_RAM bool inCrashRecoveryMode = false; +static FAST_RAM_ZERO_INIT bool inCrashRecoveryMode = false; -static FAST_RAM float dT; +static FAST_RAM_ZERO_INIT float dT; PG_REGISTER_WITH_RESET_TEMPLATE(pidConfig_t, pidConfig, PG_PID_CONFIG, 2); @@ -162,7 +162,7 @@ void pidResetITerm(void) } } -static FAST_RAM_INITIALIZED float itermAccelerator = 1.0f; +static FAST_RAM float itermAccelerator = 1.0f; void pidSetItermAccelerator(float newItermAccelerator) { @@ -189,14 +189,14 @@ typedef union dtermLowpass_u { #endif } dtermLowpass_t; -static FAST_RAM filterApplyFnPtr dtermNotchApplyFn; -static FAST_RAM biquadFilter_t dtermNotch[2]; -static FAST_RAM filterApplyFnPtr dtermLowpassApplyFn; -static FAST_RAM dtermLowpass_t dtermLowpass[2]; -static FAST_RAM filterApplyFnPtr dtermLowpass2ApplyFn; -static FAST_RAM pt1Filter_t dtermLowpass2[2]; -static FAST_RAM filterApplyFnPtr ptermYawLowpassApplyFn; -static FAST_RAM pt1Filter_t ptermYawLowpass; +static FAST_RAM_ZERO_INIT filterApplyFnPtr dtermNotchApplyFn; +static FAST_RAM_ZERO_INIT biquadFilter_t dtermNotch[2]; +static FAST_RAM_ZERO_INIT filterApplyFnPtr dtermLowpassApplyFn; +static FAST_RAM_ZERO_INIT dtermLowpass_t dtermLowpass[2]; +static FAST_RAM_ZERO_INIT filterApplyFnPtr dtermLowpass2ApplyFn; +static FAST_RAM_ZERO_INIT pt1Filter_t dtermLowpass2[2]; +static FAST_RAM_ZERO_INIT filterApplyFnPtr ptermYawLowpassApplyFn; +static FAST_RAM_ZERO_INIT pt1Filter_t ptermYawLowpass; void pidInitFilters(const pidProfile_t *pidProfile) { @@ -289,25 +289,25 @@ typedef struct pidCoefficient_s { float Kd; } pidCoefficient_t; -static FAST_RAM pidCoefficient_t pidCoefficient[3]; -static FAST_RAM float maxVelocity[3]; -static FAST_RAM float relaxFactor; -static FAST_RAM float dtermSetpointWeight; -static FAST_RAM float levelGain, horizonGain, horizonTransition, horizonCutoffDegrees, horizonFactorRatio; -static FAST_RAM float ITermWindupPointInv; -static FAST_RAM uint8_t horizonTiltExpertMode; -static FAST_RAM timeDelta_t crashTimeLimitUs; -static FAST_RAM timeDelta_t crashTimeDelayUs; -static FAST_RAM int32_t crashRecoveryAngleDeciDegrees; -static FAST_RAM float crashRecoveryRate; -static FAST_RAM float crashDtermThreshold; -static FAST_RAM float crashGyroThreshold; -static FAST_RAM float crashSetpointThreshold; -static FAST_RAM float crashLimitYaw; -static FAST_RAM float itermLimit; -FAST_RAM float throttleBoost; +static FAST_RAM_ZERO_INIT pidCoefficient_t pidCoefficient[3]; +static FAST_RAM_ZERO_INIT float maxVelocity[3]; +static FAST_RAM_ZERO_INIT float relaxFactor; +static FAST_RAM_ZERO_INIT float dtermSetpointWeight; +static FAST_RAM_ZERO_INIT float levelGain, horizonGain, horizonTransition, horizonCutoffDegrees, horizonFactorRatio; +static FAST_RAM_ZERO_INIT float ITermWindupPointInv; +static FAST_RAM_ZERO_INIT uint8_t horizonTiltExpertMode; +static FAST_RAM_ZERO_INIT timeDelta_t crashTimeLimitUs; +static FAST_RAM_ZERO_INIT timeDelta_t crashTimeDelayUs; +static FAST_RAM_ZERO_INIT int32_t crashRecoveryAngleDeciDegrees; +static FAST_RAM_ZERO_INIT float crashRecoveryRate; +static FAST_RAM_ZERO_INIT float crashDtermThreshold; +static FAST_RAM_ZERO_INIT float crashGyroThreshold; +static FAST_RAM_ZERO_INIT float crashSetpointThreshold; +static FAST_RAM_ZERO_INIT float crashLimitYaw; +static FAST_RAM_ZERO_INIT float itermLimit; +FAST_RAM_ZERO_INIT float throttleBoost; pt1Filter_t throttleLpf; -static FAST_RAM bool itermRotation; +static FAST_RAM_ZERO_INIT bool itermRotation; void pidInitConfig(const pidProfile_t *pidProfile) { diff --git a/src/main/scheduler/scheduler.c b/src/main/scheduler/scheduler.c index 3e2071322b..d5ea17b74e 100644 --- a/src/main/scheduler/scheduler.c +++ b/src/main/scheduler/scheduler.c @@ -45,21 +45,21 @@ // 2 - time spent in scheduler // 3 - time spent executing check function -static FAST_RAM cfTask_t *currentTask = NULL; +static FAST_RAM_ZERO_INIT cfTask_t *currentTask = NULL; -static FAST_RAM uint32_t totalWaitingTasks; -static FAST_RAM uint32_t totalWaitingTasksSamples; +static FAST_RAM_ZERO_INIT uint32_t totalWaitingTasks; +static FAST_RAM_ZERO_INIT uint32_t totalWaitingTasksSamples; -static FAST_RAM bool calculateTaskStatistics; -FAST_RAM uint16_t averageSystemLoadPercent = 0; +static FAST_RAM_ZERO_INIT bool calculateTaskStatistics; +FAST_RAM_ZERO_INIT uint16_t averageSystemLoadPercent = 0; -static FAST_RAM int taskQueuePos = 0; -STATIC_UNIT_TESTED FAST_RAM int taskQueueSize = 0; +static FAST_RAM_ZERO_INIT int taskQueuePos = 0; +STATIC_UNIT_TESTED FAST_RAM_ZERO_INIT int taskQueueSize = 0; // No need for a linked list for the queue, since items are only inserted at startup -STATIC_UNIT_TESTED FAST_RAM cfTask_t* taskQueueArray[TASK_COUNT + 1]; // extra item for NULL pointer at end of queue +STATIC_UNIT_TESTED FAST_RAM_ZERO_INIT cfTask_t* taskQueueArray[TASK_COUNT + 1]; // extra item for NULL pointer at end of queue void queueClear(void) { diff --git a/src/main/sensors/acceleration.c b/src/main/sensors/acceleration.c index ea2e589bcd..c1616fca0c 100644 --- a/src/main/sensors/acceleration.c +++ b/src/main/sensors/acceleration.c @@ -82,7 +82,7 @@ #endif -FAST_RAM acc_t acc; // acc access functions +FAST_RAM_ZERO_INIT acc_t acc; // acc access functions static float accumulatedMeasurements[XYZ_AXIS_COUNT]; static int accumulatedMeasurementCount; diff --git a/src/main/sensors/gyro.c b/src/main/sensors/gyro.c index 501afad692..9af0a71ef5 100644 --- a/src/main/sensors/gyro.c +++ b/src/main/sensors/gyro.c @@ -83,18 +83,18 @@ #define USE_GYRO_SLEW_LIMITER #endif -FAST_RAM gyro_t gyro; -static FAST_RAM uint8_t gyroDebugMode; +FAST_RAM_ZERO_INIT gyro_t gyro; +static FAST_RAM_ZERO_INIT uint8_t gyroDebugMode; static uint8_t gyroToUse = 0; #ifdef USE_GYRO_OVERFLOW_CHECK -static FAST_RAM uint8_t overflowAxisMask; +static FAST_RAM_ZERO_INIT uint8_t overflowAxisMask; #endif -static FAST_RAM float accumulatedMeasurements[XYZ_AXIS_COUNT]; -static FAST_RAM float gyroPrevious[XYZ_AXIS_COUNT]; -static FAST_RAM timeUs_t accumulatedMeasurementTimeUs; -static FAST_RAM timeUs_t accumulationLastTimeSampledUs; +static FAST_RAM_ZERO_INIT float accumulatedMeasurements[XYZ_AXIS_COUNT]; +static FAST_RAM_ZERO_INIT float gyroPrevious[XYZ_AXIS_COUNT]; +static FAST_RAM_ZERO_INIT timeUs_t accumulatedMeasurementTimeUs; +static FAST_RAM_ZERO_INIT timeUs_t accumulationLastTimeSampledUs; static bool gyroHasOverflowProtection = true; @@ -152,9 +152,9 @@ typedef struct gyroSensor_s { } gyroSensor_t; -STATIC_UNIT_TESTED FAST_RAM gyroSensor_t gyroSensor1; +STATIC_UNIT_TESTED FAST_RAM_ZERO_INIT gyroSensor_t gyroSensor1; #ifdef USE_DUAL_GYRO -STATIC_UNIT_TESTED FAST_RAM gyroSensor_t gyroSensor2; +STATIC_UNIT_TESTED FAST_RAM_ZERO_INIT gyroSensor_t gyroSensor2; #endif #ifdef UNIT_TEST diff --git a/src/main/sensors/gyroanalyse.c b/src/main/sensors/gyroanalyse.c index 8059c6fa80..a5958894b3 100644 --- a/src/main/sensors/gyroanalyse.c +++ b/src/main/sensors/gyroanalyse.c @@ -57,27 +57,27 @@ #define BIQUAD_Q 1.0f / sqrtf(2.0f) // quality factor - butterworth -static FAST_RAM uint16_t fftSamplingScale; +static FAST_RAM_ZERO_INIT uint16_t fftSamplingScale; // gyro data used for frequency analysis -static float FAST_RAM gyroData[XYZ_AXIS_COUNT][FFT_WINDOW_SIZE]; +static float FAST_RAM_ZERO_INIT gyroData[XYZ_AXIS_COUNT][FFT_WINDOW_SIZE]; -static FAST_RAM arm_rfft_fast_instance_f32 fftInstance; -static FAST_RAM float fftData[FFT_WINDOW_SIZE]; -static FAST_RAM float rfftData[FFT_WINDOW_SIZE]; -static FAST_RAM gyroFftData_t fftResult[XYZ_AXIS_COUNT]; +static FAST_RAM_ZERO_INIT arm_rfft_fast_instance_f32 fftInstance; +static FAST_RAM_ZERO_INIT float fftData[FFT_WINDOW_SIZE]; +static FAST_RAM_ZERO_INIT float rfftData[FFT_WINDOW_SIZE]; +static FAST_RAM_ZERO_INIT gyroFftData_t fftResult[XYZ_AXIS_COUNT]; // use a circular buffer for the last FFT_WINDOW_SIZE samples -static FAST_RAM uint16_t fftIdx; +static FAST_RAM_ZERO_INIT uint16_t fftIdx; // bandpass filter gyro data -static FAST_RAM biquadFilter_t fftGyroFilter[XYZ_AXIS_COUNT]; +static FAST_RAM_ZERO_INIT biquadFilter_t fftGyroFilter[XYZ_AXIS_COUNT]; // filter for smoothing frequency estimation -static FAST_RAM biquadFilter_t fftFreqFilter[XYZ_AXIS_COUNT]; +static FAST_RAM_ZERO_INIT biquadFilter_t fftFreqFilter[XYZ_AXIS_COUNT]; // Hanning window, see https://en.wikipedia.org/wiki/Window_function#Hann_.28Hanning.29_window -static FAST_RAM float hanningWindow[FFT_WINDOW_SIZE]; +static FAST_RAM_ZERO_INIT float hanningWindow[FFT_WINDOW_SIZE]; void initHanning(void) { @@ -128,10 +128,10 @@ const gyroFftData_t *gyroFftData(int axis) void gyroDataAnalyse(const gyroDev_t *gyroDev, biquadFilter_t *notchFilterDyn) { // accumulator for oversampled data => no aliasing and less noise - static FAST_RAM float fftAcc[XYZ_AXIS_COUNT]; - static FAST_RAM uint32_t fftAccCount; + static FAST_RAM_ZERO_INIT float fftAcc[XYZ_AXIS_COUNT]; + static FAST_RAM_ZERO_INIT uint32_t fftAccCount; - static FAST_RAM uint32_t gyroDataAnalyseUpdateTicks; + static FAST_RAM_ZERO_INIT uint32_t gyroDataAnalyseUpdateTicks; // if gyro sampling is > 1kHz, accumulate multiple samples for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) { diff --git a/src/main/target/common_fc_pre.h b/src/main/target/common_fc_pre.h index 3e714192fc..bbcf6c6dc5 100644 --- a/src/main/target/common_fc_pre.h +++ b/src/main/target/common_fc_pre.h @@ -101,11 +101,11 @@ #endif // USE_ITCM_RAM #ifdef USE_FAST_RAM -#define FAST_RAM __attribute__ ((section(".fastram_bss"), aligned(4))) -#define FAST_RAM_INITIALIZED __attribute__ ((section(".fastram_data"), aligned(4))) +#define FAST_RAM_ZERO_INIT __attribute__ ((section(".fastram_bss"), aligned(4))) +#define FAST_RAM __attribute__ ((section(".fastram_data"), aligned(4))) #else +#define FAST_RAM_ZERO_INIT #define FAST_RAM -#define FAST_RAM_INITIALIZED #endif // USE_FAST_RAM #ifdef STM32F4 diff --git a/src/main/target/common_osd_slave.h b/src/main/target/common_osd_slave.h index 99988fda4b..1f155d940d 100644 --- a/src/main/target/common_osd_slave.h +++ b/src/main/target/common_osd_slave.h @@ -60,6 +60,7 @@ #endif #define FAST_CODE +#define FAST_RAM_ZERO_INIT #define FAST_RAM //CLI needs FC dependencies removed before we can compile it, disabling for now diff --git a/src/test/unit/platform.h b/src/test/unit/platform.h index 633cf2dfce..940d771b68 100644 --- a/src/test/unit/platform.h +++ b/src/test/unit/platform.h @@ -27,8 +27,8 @@ #define NOINLINE #define FAST_CODE +#define FAST_RAM_ZERO_INIT #define FAST_RAM -#define FAST_RAM_INITIALIZED #define MAX_PROFILE_COUNT 3 #define USE_MAG From ed72803858ac2f3711dff0ea5555aa89bfb9c001 Mon Sep 17 00:00:00 2001 From: Andrey Mironov Date: Tue, 22 May 2018 11:11:42 +0300 Subject: [PATCH 24/24] Added FAST_RAM usage correctness check --- .travis.sh | 1 + Makefile | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/.travis.sh b/.travis.sh index 1be2465df8..7e5d780831 100755 --- a/.travis.sh +++ b/.travis.sh @@ -68,6 +68,7 @@ elif [ $TARGET ] ; then elif [ $GOAL ] ; then if [ "test" == "$GOAL" ] ; then $MAKE check-target-independence || exit $? + $MAKE check-fastram-usage-correctness || exit $? fi $MAKE $GOAL || exit $? diff --git a/Makefile b/Makefile index d939fb3db3..80595b78dc 100644 --- a/Makefile +++ b/Makefile @@ -485,6 +485,21 @@ check-target-independence: fi; \ done +check-fastram-usage-correctness: + $(V1) NON_TRIVIALLY_INITIALIZED=$$(grep -Ern "\W?FAST_RAM_ZERO_INIT\W.*=.*" src/main/ | grep -Ev "=\s*(false|NULL|0(\.0*f?)?)\s*[,;]"); \ + if [ "$${NON_TRIVIALLY_INITIALIZED}" != "" ]; then \ + echo "Non-trivially initialized FAST_RAM_ZERO_INIT variables found, use FAST_RAM instead:"; \ + echo "$${NON_TRIVIALLY_INITIALIZED}"; \ + exit 1; \ + fi; \ + TRIVIALLY_INITIALIZED=$$(grep -Ern "\W?FAST_RAM\W.*;" src/main/ | grep -v "="); \ + EXPLICITLY_TRIVIALLY_INITIALIZED=$$(grep -Ern "\W?FAST_RAM\W.*;" src/main/ | grep -E "=\s*(false|NULL|0(\.0*f?)?)\s*[,;]"); \ + if [ "$${TRIVIALLY_INITIALIZED}$${EXPLICITLY_TRIVIALLY_INITIALIZED}" != "" ]; then \ + echo "Trivially initialized FAST_RAM variables found, use FAST_RAM_ZERO_INIT instead to save FLASH:"; \ + echo "$${TRIVIALLY_INITIALIZED}\n$${EXPLICITLY_TRIVIALLY_INITIALIZED}"; \ + exit 1; \ + fi; + # rebuild everything when makefile changes $(TARGET_OBJS) : Makefile