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;