From 5fc342c85cb3dc7b02abf4bc30477ae5d7df0b78 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 16 Oct 2020 16:35:31 +0200 Subject: [PATCH] Allow R9M 2019 in ACCESS mode on some radios (#7963) Support for external R9M ACCESS --- companion/src/firmwares/opentx/opentxinterface.cpp | 7 ++++++- radio/src/dataconstants.h | 2 +- radio/src/gui/480x272/radio_version.cpp | 11 +++++++++++ radio/src/options.h | 6 ++++++ radio/src/targets/horus/CMakeLists.txt | 7 +++++++ radio/src/targets/horus/board.h | 2 +- radio/src/targets/horus/hal.h | 8 ++++---- radio/src/trainer.cpp | 5 +++++ radio/util/fwoptions.py | 2 ++ 9 files changed, 43 insertions(+), 7 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 1d00c99ad..68c4daada 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -763,7 +763,7 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) case PULSES_GHOST: return true; case PULSES_ACCESS_R9M: - return IS_ACCESS_RADIO(board, id); + return IS_ACCESS_RADIO(board, id) || (IS_FAMILY_HORUS_OR_T16(board) && id.contains("externalaccessmod")); case PULSES_PXX_R9M_LITE: case PULSES_ACCESS_R9M_LITE: case PULSES_ACCESS_R9M_LITE_PRO: @@ -1232,6 +1232,7 @@ void registerOpenTxFirmwares() firmware = new OpenTxFirmware("opentx-x10", Firmware::tr("FrSky Horus X10 / X10S"), BOARD_X10); addOpenTxFrskyOptions(firmware); firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); + firmware->addOption("externalaccessmod", Firmware::tr("Support hardware mod: R9M ACCESS")); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, EU + FLEX); @@ -1245,6 +1246,7 @@ void registerOpenTxFirmwares() firmware = new OpenTxFirmware("opentx-x12s", Firmware::tr("FrSky Horus X12S"), BOARD_HORUS_X12S); addOpenTxFrskyOptions(firmware); firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); + firmware->addOption("externalaccessmod", Firmware::tr("Support hardware mod: R9M ACCESS")); firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version")); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, EU + FLEX); @@ -1265,6 +1267,7 @@ void registerOpenTxFirmwares() addOpenTxFrskyOptions(firmware); firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + firmware->addOption("externalaccessmod", Firmware::tr("Support hardware mod: R9M ACCESS")); addOpenTxRfOptions(firmware, FLEX); registerOpenTxFirmware(firmware); @@ -1275,12 +1278,14 @@ void registerOpenTxFirmwares() static const Firmware::Option opt_bt("bluetooth", Firmware::tr("Support for bluetooth module")); static const Firmware::Option opt_internal_gps("internalgps", Firmware::tr("Support internal GPS")); firmware->addOptionsGroup({opt_bt, opt_internal_gps}); + firmware->addOption("externalaccessmod", Firmware::tr("Support hardware mod: R9M ACCESS")); registerOpenTxFirmware(firmware); /* Jumper T18 board */ firmware = new OpenTxFirmware("opentx-t18", Firmware::tr("Jumper T18"), BOARD_JUMPER_T18); addOpenTxFrskyOptions(firmware); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + firmware->addOption("externalaccessmod", Firmware::tr("Support hardware mod: R9M ACCESS")); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 52ddc5854..214bcad8c 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -193,7 +193,7 @@ enum TrainerMode { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, #endif -#if defined(PCBTARANIS) || defined(AUX_SERIAL) +#if defined(PCBTARANIS) || defined(AUX_SERIAL) || defined(AUX2_SERIAL) TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, #endif TRAINER_MODE_MASTER_BLUETOOTH, diff --git a/radio/src/gui/480x272/radio_version.cpp b/radio/src/gui/480x272/radio_version.cpp index 63301619a..6f8260056 100644 --- a/radio/src/gui/480x272/radio_version.cpp +++ b/radio/src/gui/480x272/radio_version.cpp @@ -92,6 +92,17 @@ bool menuRadioModulesVersion(event_t event) y += FH; continue; } +#if defined(HARDWARE_EXTERNAL_ACCESS_MOD) + if (isModuleMultimodule(INTERNAL_MODULE)) { + char statusText[64]; + lcdDrawText(COLUMN2_X, y, "Multimodule"); + y += FH; + getMultiModuleStatus(INTERNAL_MODULE).getStatusString(statusText); + lcdDrawText(COLUMN2_X, y, statusText); + y += FH; + continue; + } +#endif if (!isModulePXX2(INTERNAL_MODULE)) { lcdDrawText(COLUMN2_X, y, STR_NO_INFORMATION); y += FH; diff --git a/radio/src/options.h b/radio/src/options.h index f2b3c8369..acadfd129 100644 --- a/radio/src/options.h +++ b/radio/src/options.h @@ -26,6 +26,9 @@ static const char * const options[] = { #if defined(AUTOUPDATE) "autoupdate", #endif +#if defined(BLUETOOTH) + "bluetooth", +#endif #if defined(CROSSFIRE) "crossfire", #endif @@ -91,6 +94,9 @@ static const char * const options[] = { #endif #if defined(SHUTDOWN_CONFIRMATION) "shutdownconfirm", +#endif +#if defined(HARDWARE_EXTERNAL_ACCESS_MOD) + "externalaccessmod", #endif nullptr //sentinel }; diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index d8778fc78..06327589b 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -5,6 +5,7 @@ option(PXX2 "PXX2 protocol support" OFF) option(AFHDS3 "AFHDS3 TX Module" ON) option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" ON) option(GHOST "Ghost TX Module" ON) +option(HARDWARE_EXTERNAL_ACCESS_MOD "Support for R9M 2019 hardware mod" OFF) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F4) @@ -139,6 +140,12 @@ if(NOT UNEXPECTED_SHUTDOWN) add_definitions(-DNO_UNEXPECTED_SHUTDOWN) endif() +if(HARDWARE_EXTERNAL_ACCESS_MOD) + set(PXX2 ON) + set(AUX_SERIAL OFF) + add_definitions(-DHARDWARE_EXTERNAL_ACCESS_MOD) +endif() + if(INTERNAL_MODULE_PXX1) add_definitions(-DHARDWARE_INTERNAL_MODULE) add_definitions(-DINTERNAL_MODULE_PXX1) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index f95bd81b0..01826dfa3 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -635,8 +635,8 @@ void sportUpdatePowerInit(); #endif // Aux serial port driver -#if defined(AUX_SERIAL_GPIO) #define DEBUG_BAUDRATE 115200 +#if defined(AUX_SERIAL_GPIO) extern uint8_t auxSerialMode; void auxSerialInit(unsigned int mode, unsigned int protocol); void auxSerialPutc(char c); diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index dd8f6ec70..e4d113488 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -402,7 +402,7 @@ #endif // Serial Port (DEBUG) -#if defined(PCBX12S) || defined(RADIO_TX16S) +#if (defined(PCBX12S) || defined(RADIO_TX16S)) && !defined(HARDWARE_EXTERNAL_ACCESS_MOD) #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 #define AUX_SERIAL_RCC_APB2Periph 0 @@ -762,7 +762,7 @@ #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_9 // PI.09 #endif #define INIT_INTMODULE_BOOTCMD_PIN() GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); -#if defined(PCBX10) || PCBREV >= 13 +#if (defined(PCBX10) || PCBREV >= 13) && !defined(HARDWARE_EXTERNAL_ACCESS_MOD) //TIM2 used by ext mod #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 #define INTMODULE_TIMER TIM2 @@ -782,7 +782,7 @@ #define EXTMODULE_PWR_GPIO GPIOB #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_3 // PB.03 #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) -#if defined(PCBX10) && defined(PCBREV_EXPRESS) +#if (defined(PCBX10) && defined(PCBREV_EXPRESS)) || defined(HARDWARE_EXTERNAL_ACCESS_MOD) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define EXTMODULE_RCC_APB1Periph (RCC_APB1Periph_TIM2 | RCC_APB1Periph_USART3) #define EXTMODULE_RCC_APB2Periph 0 @@ -861,7 +861,7 @@ #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line12 #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI15_10_IRQn #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER -#if defined(PXX2) +#if defined(INTERNAL_MODULE_PXX2) #define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Falling #else #define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Rising diff --git a/radio/src/trainer.cpp b/radio/src/trainer.cpp index 27a237b54..94f624d3d 100644 --- a/radio/src/trainer.cpp +++ b/radio/src/trainer.cpp @@ -139,8 +139,13 @@ void checkTrainerSettings() stop_intmodule_heartbeat(); else init_intmodule_heartbeat(); +#else +#if defined(HARDWARE_EXTERNAL_ACCESS_MOD) + if (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_R9M_PXX2) // externalaccessmod 'bridges' HB and Ext module RX pins + init_intmodule_heartbeat(); #else init_intmodule_heartbeat(); +#endif #endif } } diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 140cf4b47..6a71c7096 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -229,6 +229,7 @@ options_jumper_t16 = { "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "internalmulti": ("INTERNAL_MODULE_MULTI", "YES", "NO"), "bluetooth": ("BLUETOOTH", "YES", "NO"), + "externalaccessmod": ("HARDWARE_EXTERNAL_ACCESS_MOD", "YES", "NO"), } options_jumper_t18 = { @@ -254,4 +255,5 @@ options_radiomaster_tx16s = { "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "bluetooth": ("BLUETOOTH", "YES", "NO"), "internalgps": ("INTERNAL_GPS", "YES", "NO"), + "externalaccessmod": ("HARDWARE_EXTERNAL_ACCESS_MOD", "YES", "NO"), } \ No newline at end of file