diff --git a/src/main/fc/config.c b/src/main/fc/config.c index eaa40a7ed6..d597fc128a 100755 --- a/src/main/fc/config.c +++ b/src/main/fc/config.c @@ -407,6 +407,7 @@ void resetFlight3DConfig(flight3DConfig_t *flight3DConfig) void resetTelemetryConfig(telemetryConfig_t *telemetryConfig) { telemetryConfig->telemetry_inversion = 1; + telemetryConfig->sportHalfDuplex = 1; telemetryConfig->telemetry_switch = 0; telemetryConfig->gpsNoFixLatitude = 0; telemetryConfig->gpsNoFixLongitude = 0; diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 43c45c1864..5783a3a170 100755 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -787,6 +787,7 @@ const clivalue_t valueTable[] = { #ifdef TELEMETRY { "telemetry_switch", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &telemetryConfig()->telemetry_switch, .config.lookup = { TABLE_OFF_ON } }, { "telemetry_inversion", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &telemetryConfig()->telemetry_inversion, .config.lookup = { TABLE_OFF_ON } }, + { "sport_halfduplex", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &telemetryConfig()->sportHalfDuplex, .config.lookup = { TABLE_OFF_ON } }, { "frsky_default_lattitude", VAR_FLOAT | MASTER_VALUE, &telemetryConfig()->gpsNoFixLatitude, .config.minmax = { -90.0, 90.0 } }, { "frsky_default_longitude", VAR_FLOAT | MASTER_VALUE, &telemetryConfig()->gpsNoFixLongitude, .config.minmax = { -180.0, 180.0 } }, { "frsky_coordinates_format", VAR_UINT8 | MASTER_VALUE, &telemetryConfig()->frsky_coordinate_format, .config.minmax = { 0, FRSKY_FORMAT_NMEA } }, diff --git a/src/main/main.c b/src/main/main.c index 90aaa03306..6412f8d6d5 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -124,6 +124,10 @@ #include "build/build_config.h" #include "build/debug.h" +#ifdef TARGET_PREINIT +void targetPreInit(void); +#endif + #ifdef TARGET_BUS_INIT void targetBusInit(void); #endif @@ -180,7 +184,11 @@ void init(void) // Latch active features to be used for feature() in the remainder of init(). latchActiveFeatures(); - ledInit(&masterConfig.statusLedConfig); +#ifdef TARGET_PREINIT + targetPreInit(); +#endif + + ledInit(statusLedConfig()); LED2_ON; #ifdef USE_EXTI @@ -268,9 +276,9 @@ void init(void) #endif #ifdef USE_QUAD_MIXER_ONLY - motorInit(&masterConfig.motorConfig, idlePulse, QUAD_MOTOR_COUNT); + motorInit(motorConfig(), idlePulse, QUAD_MOTOR_COUNT); #else - motorInit(&masterConfig.motorConfig, idlePulse, motorCount); + motorInit(motorConfig(), idlePulse, motorCount); #endif #ifdef USE_SERVOS @@ -291,7 +299,7 @@ void init(void) systemState |= SYSTEM_STATE_MOTORS_READY; #ifdef BEEPER - beeperInit(&masterConfig.beeperConfig); + beeperInit(beeperConfig()); #endif /* temp until PGs are implemented. */ #ifdef INVERTER @@ -350,10 +358,10 @@ void init(void) adcConfig()->vbat.enabled = feature(FEATURE_VBAT); adcConfig()->currentMeter.enabled = feature(FEATURE_CURRENT_METER); adcConfig()->rssi.enabled = feature(FEATURE_RSSI_ADC); - adcInit(&masterConfig.adcConfig); + adcInit(adcConfig()); #endif - initBoardAlignment(&masterConfig.boardAlignment); + initBoardAlignment(boardAlignment()); #ifdef CMS cmsInit(); @@ -361,7 +369,7 @@ void init(void) #ifdef USE_DASHBOARD if (feature(FEATURE_DASHBOARD)) { - dashboardInit(&masterConfig.rxConfig); + dashboardInit(rxConfig()); } #endif @@ -428,12 +436,12 @@ void init(void) #endif #ifdef USE_CLI - cliInit(&masterConfig.serialConfig); + cliInit(serialConfig()); #endif - failsafeInit(&masterConfig.rxConfig, flight3DConfig()->deadband3d_throttle); + failsafeInit(rxConfig(), flight3DConfig()->deadband3d_throttle); - rxInit(&masterConfig.rxConfig, masterConfig.modeActivationConditions); + rxInit(rxConfig(), masterConfig.modeActivationConditions); #ifdef GPS if (feature(FEATURE_GPS)) { @@ -449,7 +457,7 @@ void init(void) #endif #ifdef LED_STRIP - ledStripInit(&masterConfig.ledStripConfig); + ledStripInit(ledStripConfig()); if (feature(FEATURE_LED_STRIP)) { ledStripEnable(); diff --git a/src/main/target/BLUEJAYF4/initialisation.c b/src/main/target/BLUEJAYF4/initialisation.c new file mode 100644 index 0000000000..a11301baa0 --- /dev/null +++ b/src/main/target/BLUEJAYF4/initialisation.c @@ -0,0 +1,48 @@ +/* + * This file is part of Cleanflight. + * + * Cleanflight is free software: you can redistribute it and/or modify + * it under the terms of the 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 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cleanflight. If not, see . + */ + +#include +#include + +#include "platform.h" +#include "drivers/bus_i2c.h" +#include "drivers/bus_spi.h" +#include "hardware_revision.h" +#include "config/config_master.h" +#include "drivers/io.h" +#include "config/feature.h" + +void targetPreInit(void) +{ + /* enable the built in inverter if telemetry is setup for the UART1 */ + if (serialConfig()->portConfigs[SERIAL_PORT_USART1].functionMask & FUNCTION_TELEMETRY_SMARTPORT && + telemetryConfig()->telemetry_inversion && + feature(FEATURE_TELEMETRY)) { + IO_t io = IOGetByTag(IO_TAG(UART1_INVERTER)); + IOInit(io, OWNER_INVERTER, 1); + IOConfigGPIO(io, IOCFG_OUT_PP); + IOHi(io); + } + + /* ensure the CS pin for the flash is pulled hi so any SD card initialisation does not impact the chip */ + if (hardwareRevision == BJF4_REV3) { + IO_t io = IOGetByTag(IO_TAG(M25P16_CS_PIN)); + IOConfigGPIO(io, IOCFG_OUT_PP); + IOHi(io); + } +} + diff --git a/src/main/target/BLUEJAYF4/target.h b/src/main/target/BLUEJAYF4/target.h index 750ebf7ab5..17a1d389a2 100644 --- a/src/main/target/BLUEJAYF4/target.h +++ b/src/main/target/BLUEJAYF4/target.h @@ -19,6 +19,7 @@ #define TARGET_BOARD_IDENTIFIER "BJF4" #define TARGET_CONFIG #define TARGET_VALIDATECONFIG +#define TARGET_PREINIT #define CONFIG_START_FLASH_ADDRESS (0x08080000) //0x08080000 to 0x080A0000 (FLASH_Sector_8) @@ -40,6 +41,8 @@ #define INVERTER PB15 #define INVERTER_USART USART6 +#define UART1_INVERTER PC9 + // MPU6500 interrupt #define USE_EXTI #define MPU_INT_EXTI PC5 diff --git a/src/main/telemetry/smartport.c b/src/main/telemetry/smartport.c index 4d1d19718a..d33ebb09a7 100644 --- a/src/main/telemetry/smartport.c +++ b/src/main/telemetry/smartport.c @@ -328,12 +328,14 @@ void configureSmartPortTelemetryPort(void) return; } - portOptions = SERIAL_BIDIR; - + if (telemetryConfig->sportHalfDuplex) { + portOptions = SERIAL_BIDIR; + } + if (telemetryConfig->telemetry_inversion) { portOptions |= SERIAL_INVERTED; } - + smartPortSerialPort = openSerialPort(portConfig->identifier, FUNCTION_TELEMETRY_SMARTPORT, NULL, SMARTPORT_BAUD, SMARTPORT_UART_MODE, portOptions); if (!smartPortSerialPort) { diff --git a/src/main/telemetry/telemetry.h b/src/main/telemetry/telemetry.h index f656578b95..91b2ff004a 100644 --- a/src/main/telemetry/telemetry.h +++ b/src/main/telemetry/telemetry.h @@ -37,6 +37,7 @@ typedef enum { typedef struct telemetryConfig_s { uint8_t telemetry_switch; // Use aux channel to change serial output & baudrate( MSP / Telemetry ). It disables automatic switching to Telemetry when armed. uint8_t telemetry_inversion; // also shared with smartport inversion + uint8_t sportHalfDuplex; float gpsNoFixLatitude; float gpsNoFixLongitude; frskyGpsCoordFormat_e frsky_coordinate_format;