diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 413c5efcd..a0571ac61 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -666,7 +666,8 @@ PACK(struct TrainerData { #if defined(PCBHORUS) #define EXTRA_GENERAL_FIELDS \ - NOBACKUP(uint8_t auxSerialMode); \ + NOBACKUP(uint8_t auxSerialMode:4); \ + NOBACKUP(uint8_t aux2SerialMode:4); \ swconfig_t switchConfig; \ uint16_t potsConfig; /* two bits per pot */ \ uint8_t slidersConfig; /* 1 bit per slider */ \ diff --git a/radio/src/debug.h b/radio/src/debug.h index 2ed2f209b..e73c73f29 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -38,6 +38,7 @@ extern "C" { #endif uint8_t auxSerialTracesEnabled(); +uint8_t aux2SerialTracesEnabled(); #if defined(SIMU) typedef void (*traceCallbackFunc)(const char * text); diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 37f81bed3..3ba908ad9 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -70,7 +70,9 @@ enum MenuRadioHardwareItems { #if defined(AUX_SERIAL) ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE, #endif - +#if defined(AUX2_SERIAL) + ITEM_RADIO_HARDWARE_AUX2_SERIAL_MODE, +#endif ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_HARDWARE_RAS, @@ -89,6 +91,11 @@ enum MenuRadioHardwareItems { #else #define AUX_SERIAL_ROW #endif +#if defined(AUX2_SERIAL) +#define AUX2_SERIAL_ROW 0, +#else +#define AUX2_SERIAL_ROW +#endif #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 @@ -159,6 +166,7 @@ bool menuRadioHardware(event_t event) EXTERNAL_ANTENNA_ROW AUX_SERIAL_ROW /* aux serial mode */ + AUX2_SERIAL_ROW /* aux2 serial mode */ 0, /* ADC filter */ READONLY_ROW /* RAS */, SPORT_POWER_ROWS @@ -371,6 +379,19 @@ bool menuRadioHardware(event_t event) break; #endif +#if defined(AUX2_SERIAL) + case ITEM_RADIO_HARDWARE_AUX2_SERIAL_MODE: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_AUX2_SERIAL_MODE); +#if defined(RADIO_TX16S) + lcdDrawText(lcdNextPos, y, " (TTL)"); +#endif + g_eeGeneral.aux2SerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.aux2SerialMode, 0, UART_MODE_MAX, attr, event); + if (attr && checkIncDec_Ret) { + aux2SerialInit(g_eeGeneral.aux2SerialMode, modelTelemetryProtocol()); + } + break; +#endif + case ITEM_RADIO_HARDWARE_JITTER_FILTER: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_JITTER_FILTER); diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 06b11449c..778af80c6 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1601,6 +1601,13 @@ static int luaSerialWrite(lua_State * L) while(wr_len--) auxSerialPutc(*p++); } #endif +#if defined(AUX2_SERIAL) + if (aux2SerialMode == UART_MODE_LUA) { + size_t wr_len = len; + const char* p = str; + while(wr_len--) aux2SerialPutc(*p++); + } +#endif #else debugPrintf("luaSerialWrite: %.*s",len,str); #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index eeb2d2ef2..9e5ced95e 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1939,6 +1939,10 @@ void opentxInit() auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol()); #endif +#if defined(AUX2_SERIAL) + aux2SerialInit(g_eeGeneral.aux2SerialMode, modelTelemetryProtocol()); +#endif + #if MENUS_LOCK == 1 getMovedSwitch(); if (TRIMS_PRESSED() && g_eeGeneral.switchUnlockStates==switches_states) { diff --git a/radio/src/serial.cpp b/radio/src/serial.cpp index 953a865f5..c83b2fd92 100644 --- a/radio/src/serial.cpp +++ b/radio/src/serial.cpp @@ -34,6 +34,10 @@ void serialPutc(char c) { if (auxSerialTracesEnabled()) auxSerialPutc(c); #endif +#if defined(AUX2_SERIAL) + if (aux2SerialTracesEnabled()) + aux2SerialPutc(c); +#endif } void serialPrintf(const char * format, ...) diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index fe047ed80..dfca770ac 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -400,7 +400,7 @@ void convertRadioData_218_to_219(RadioData & settings) #if defined(PCBHORUS) // 2 new pots from X10: // - copy btw. 'chkSum' and 'auxSerialMode' (excl.) - memcpy(&settings.chkSum, &oldSettings.chkSum, offsetof(RadioData, auxSerialMode) - offsetof(RadioData, chkSum)); + memcpy(&settings.chkSum, &oldSettings.chkSum, offsetof(RadioData, switchConfig) - sizeof(uint8_t) - offsetof(RadioData, chkSum)); // - move calibration data memcpy(&settings.calib[NUM_STICKS + 5], &oldSettings.calib[NUM_STICKS + 3], sizeof(CalibData) * (STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS)); memclear(&settings.calib[NUM_STICKS + 3], sizeof(CalibData) * 2); diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 58f27fed5..35a23073c 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -193,5 +193,181 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) } #endif } +#endif + +#if defined(AUX2_SERIAL) +uint8_t aux2SerialMode = 0; +Fifo aux2SerialTxFifo; +AuxSerialRxFifo aux2SerialRxFifo __DMA (AUX2_SERIAL_DMA_Stream_RX); + +void aux2SerialSetup(unsigned int baudrate, bool dma) +{ + USART_InitTypeDef USART_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_PinAFConfig(AUX2_SERIAL_GPIO, AUX2_SERIAL_GPIO_PinSource_RX, AUX2_SERIAL_GPIO_AF); + GPIO_PinAFConfig(AUX2_SERIAL_GPIO, AUX2_SERIAL_GPIO_PinSource_TX, AUX2_SERIAL_GPIO_AF); + + GPIO_InitStructure.GPIO_Pin = AUX2_SERIAL_GPIO_PIN_TX | AUX2_SERIAL_GPIO_PIN_RX; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_Init(AUX2_SERIAL_GPIO, &GPIO_InitStructure); + +#if defined(AUX2_SERIAL_PWR_GPIO) + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Pin = AUX2_SERIAL_PWR_GPIO_PIN; + GPIO_Init(AUX2_SERIAL_PWR_GPIO, &GPIO_InitStructure); +#endif + + USART_InitStructure.USART_BaudRate = baudrate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; + USART_Init(AUX2_SERIAL_USART, &USART_InitStructure); + + if (dma) { + DMA_InitTypeDef DMA_InitStructure; + aux2SerialRxFifo.clear(); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_RXNE, DISABLE); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_TXE, DISABLE); + DMA_InitStructure.DMA_Channel = AUX2_SERIAL_DMA_Channel_RX; + DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&AUX2_SERIAL_USART->DR); + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(aux2SerialRxFifo.buffer()); + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; + DMA_InitStructure.DMA_BufferSize = aux2SerialRxFifo.size(); + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_Low; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(AUX2_SERIAL_DMA_Stream_RX, &DMA_InitStructure); + USART_DMACmd(AUX2_SERIAL_USART, USART_DMAReq_Rx, ENABLE); + USART_Cmd(AUX2_SERIAL_USART, ENABLE); + DMA_Cmd(AUX2_SERIAL_DMA_Stream_RX, ENABLE); + } + else { + USART_Cmd(AUX2_SERIAL_USART, ENABLE); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_RXNE, ENABLE); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_TXE, DISABLE); + NVIC_SetPriority(AUX2_SERIAL_USART_IRQn, 7); + NVIC_EnableIRQ(AUX2_SERIAL_USART_IRQn); + } +} + +void aux2SerialInit(unsigned int mode, unsigned int protocol) +{ + aux2SerialStop(); + + aux2SerialMode = mode; + + switch (mode) { + case UART_MODE_TELEMETRY_MIRROR: +#if defined(CROSSFIRE) + if (protocol == PROTOCOL_TELEMETRY_CROSSFIRE) { + aux2SerialSetup(CROSSFIRE_TELEM_MIRROR_BAUDRATE, false); + break; + } +#endif + aux2SerialSetup(FRSKY_TELEM_MIRROR_BAUDRATE, false); + break; + +#if defined(DEBUG) || defined(CLI) + case UART_MODE_DEBUG: + aux2SerialSetup(DEBUG_BAUDRATE, false); + break; +#endif + + case UART_MODE_TELEMETRY: + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { + aux2SerialSetup(FRSKY_D_BAUDRATE, true); + } + break; + + case UART_MODE_LUA: + aux2SerialSetup(DEBUG_BAUDRATE, false); + } +} + +void aux2SerialPutc(char c) +{ +#if !defined(SIMU) + int n = 0; + while (aux2SerialTxFifo.isFull()) { + delay_ms(1); + if (++n > 100) return; + } + aux2SerialTxFifo.push(c); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_TXE, ENABLE); +#endif +} + +void aux2SerialSbusInit() +{ + aux2SerialSetup(SBUS_BAUDRATE, true); + AUX2_SERIAL_USART->CR1 |= USART_CR1_M | USART_CR1_PCE ; + AUX2_SERIAL_POWER_ON(); +} + +void aux2SerialStop() +{ + DMA_DeInit(AUX2_SERIAL_DMA_Stream_RX); + USART_DeInit(AUX2_SERIAL_USART); +} + +uint8_t aux2SerialTracesEnabled() +{ +#if defined(DEBUG) + return (aux2SerialMode == UART_MODE_DEBUG); +#else + return false; +#endif +} + +#if !defined(SIMU) +extern "C" void AUX2_SERIAL_USART_IRQHandler(void) +{ + DEBUG_INTERRUPT(INT_SER2); + // Send + if (USART_GetITStatus(AUX2_SERIAL_USART, USART_IT_TXE) != RESET) { + uint8_t txchar; + if (aux2SerialTxFifo.pop(txchar)) { + /* Write one byte to the transmit data register */ + USART_SendData(AUX2_SERIAL_USART, txchar); + } + else { + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_TXE, DISABLE); + } + } + +#if defined(CLI) + if (getSelectedUsbMode() != USB_SERIAL_MODE) { + // Receive + uint32_t status = AUX2_SERIAL_USART->SR; + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = AUX2_SERIAL_USART->DR; + if (!(status & USART_FLAG_ERRORS)) { + switch (aux2SerialMode) { + case UART_MODE_DEBUG: + cliRxFifo.push(data); + break; + } + } + status = AUX2_SERIAL_USART->SR; + } + } +#endif +} +#endif + #endif #endif // AUX_SERIAL diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index b0079b49e..c849f9e9a 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -197,15 +197,15 @@ int main() RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph | KEYS_RCC_AHB1Periph | LCD_RCC_AHB1Periph | BACKLIGHT_RCC_AHB1Periph | - AUX_SERIAL_RCC_AHB1Periph | I2C_RCC_AHB1Periph | + AUX_SERIAL_RCC_AHB1Periph | AUX2_SERIAL_RCC_AHB1Periph | I2C_RCC_AHB1Periph | SD_RCC_AHB1Periph, ENABLE); RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | LCD_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph | INTERRUPT_xMS_RCC_APB1Periph | I2C_RCC_APB1Periph | - AUX_SERIAL_RCC_APB1Periph | + AUX_SERIAL_RCC_APB1Periph | AUX2_SERIAL_RCC_APB1Periph | SD_RCC_APB1Periph, ENABLE); - RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG | AUX_SERIAL_RCC_APB2Periph, ENABLE); + RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG | AUX_SERIAL_RCC_APB2Periph | AUX2_SERIAL_RCC_APB2Periph, ENABLE); pwrInit(); keysInit(); @@ -249,6 +249,9 @@ int main() #if defined(DEBUG) && defined(AUX_SERIAL) auxSerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) #endif +#if defined(DEBUG) && defined(AUX2_SERIAL) + aux2SerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) +#endif __enable_irq(); diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index a02abfa12..b1a01e2e1 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -64,8 +64,9 @@ if (PCB STREQUAL X10) set(HARDWARE_TOUCH YES) set(USB_CHARGER YES) set(DEFAULT_THEME "DARKBLUE") + set(AUX_SERIAL ON) if (NOT BLUETOOTH) - set(AUX_SERIAL ON) + set(AUX2_SERIAL ON) endif() else() set(FLAVOUR x10) @@ -238,6 +239,11 @@ if (AUX_SERIAL) set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) endif() +if (AUX2_SERIAL) + add_definitions(-DAUX2_SERIAL) + set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) +endif() + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 15b14ac2f..704a6f27c 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -96,6 +96,7 @@ void boardInit() KEYS_RCC_AHB1Periph | ADC_RCC_AHB1Periph | AUX_SERIAL_RCC_AHB1Periph | + AUX2_SERIAL_RCC_AHB1Periph | TELEMETRY_RCC_AHB1Periph | TRAINER_RCC_AHB1Periph | BT_RCC_AHB1Periph | @@ -116,6 +117,7 @@ void boardInit() TIMER_2MHz_RCC_APB1Periph | AUDIO_RCC_APB1Periph | AUX_SERIAL_RCC_APB1Periph | + AUX2_SERIAL_RCC_APB1Periph | TELEMETRY_RCC_APB1Periph | TRAINER_RCC_APB1Periph | AUDIO_RCC_APB1Periph | @@ -135,6 +137,7 @@ void boardInit() TELEMETRY_RCC_APB2Periph | BT_RCC_APB2Periph | AUX_SERIAL_RCC_APB2Periph | + AUX2_SERIAL_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph, ENABLE); @@ -147,6 +150,9 @@ void boardInit() #if defined(DEBUG) && defined(AUX_SERIAL) auxSerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) #endif +#if defined(DEBUG) && defined(AUX2_SERIAL) + aux2SerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) +#endif TRACE("\nHorus board started :)"); TRACE("RCC->CSR = %08x", RCC->CSR); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 437346078..74ebd7368 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -615,7 +615,7 @@ void sportUpdatePowerInit(); #define IS_SPORT_UPDATE_POWER_ON() (false) #endif -// Second serial port driver +// Aux serial port driver #if defined(AUX_SERIAL_GPIO) #define DEBUG_BAUDRATE 115200 extern uint8_t auxSerialMode; @@ -635,6 +635,25 @@ void auxSerialPowerOff(); #endif #endif +// Aux2 serial port driver +#if defined(AUX2_SERIAL) +extern uint8_t aux2SerialMode; +void aux2SerialInit(unsigned int mode, unsigned int protocol); +void aux2SerialPutc(char c); +#define aux2SerialTelemetryInit(protocol) aux2SerialInit(UART_MODE_TELEMETRY, protocol) +void aux2SerialSbusInit(); +void aux2SerialStop(); +void aux2SerialPowerOn(); +void aux2SerialPowerOff(); +#if defined(AUX2_SERIAL_PWR_GPIO) +#define AUX2_SERIAL_POWER_ON() aux2SerialPowerOn() +#define AUX2_SERIAL__POWER_OFF() aux2SerialPowerOff() +#else +#define AUX2_SERIAL_POWER_ON() +#define AUX2_SERIAL__POWER_OFF() +#endif +#endif + // Haptic driver void hapticInit(); void hapticDone(); diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index c37f1ba54..f964e0137 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -433,6 +433,10 @@ #define AUX2_SERIAL_DMA_Channel_RX DMA_Channel_5 #define AUX2_SERIAL_PWR_GPIO GPIOB #define AUX2_SERIAL_PWR_GPIO_PIN GPIO_Pin_0 // PB.00 +#else + #define AUX2_SERIAL_RCC_AHB1Periph 0 + #define AUX2_SERIAL_RCC_APB1Periph 0 + #define AUX2_SERIAL_RCC_APB2Periph 0 #endif // Telemetry diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 73a4948ca..fa0122175 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -787,3 +787,23 @@ void auxSerialStop() { } #endif + +#if defined(AUX2_SERIAL) +AuxSerialRxFifo aux2SerialRxFifo(nullptr); +uint8_t aux2SerialMode; +void aux2SerialInit(unsigned int mode, unsigned int protocol) +{ +} + +void aux2SerialPutc(char c) +{ +} + +void aux2SerialSbusInit() +{ +} + +void aux2SerialStop() +{ +} +#endif diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index acba12d76..e62b71523 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -785,7 +785,7 @@ void hapticOff(); void hapticOn(); #endif -// Second serial port driver +// Aux serial port driver #if defined(AUX_SERIAL_GPIO) #define DEBUG_BAUDRATE 115200 #define AUX_SERIAL @@ -796,7 +796,7 @@ void auxSerialPutc(char c); void auxSerialSbusInit(); void auxSerialStop(); #define AUX_SERIAL_POWER_ON() -#define AUX_SERIAL__POWER_OFF() +#define AUX_SERIAL_POWER_OFF() #endif // BT driver diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index b55226edf..cfe9830b7 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1323,6 +1323,11 @@ #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4 #endif +// No aux2 on taranis +#define AUX2_SERIAL_RCC_AHB1Periph 0 +#define AUX2_SERIAL_RCC_APB1Periph 0 +#define AUX2_SERIAL_RCC_APB2Periph 0 + // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index 724fbe1a0..07f3577f4 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -201,6 +201,11 @@ void processCrossfireTelemetryData(uint8_t data) auxSerialPutc(data); } #endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_TELEMETRY_MIRROR) { + aux2SerialPutc(data); + } +#endif if (telemetryRxBufferCount == 0 && data != RADIO_ADDRESS) { TRACE("[XF] address 0x%02X error", data); diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 0fe1a5bfd..611ece4ac 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -32,6 +32,11 @@ void processFrskyTelemetryData(uint8_t data) auxSerialPutc(data); } #endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_TELEMETRY_MIRROR) { + aux2SerialPutc(data); + } +#endif if (pushFrskyTelemetryData(data)) { if (IS_FRSKY_SPORT_PROTOCOL()) { diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 3719d660b..55f09eed3 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -322,6 +322,12 @@ static void processMultiTelemetryPaket(const uint8_t * packet, uint8_t module) auxSerialPutc(packet[c]); } #endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_TELEMETRY_MIRROR) { + for (uint8_t c=0; c < len; c++) + aux2SerialPutc(packet[c]); + } +#endif // Switch type switch (type) { diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 4f43e33d1..39a5bc556 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -564,6 +564,7 @@ const char STR_ALTITUDE[] = TR_ALTITUDE; const char STR_SCALE[] = TR_SCALE; const char STR_VIEW_CHANNELS[] = TR_VIEW_CHANNELS; const char STR_AUX_SERIAL_MODE[] = TR_AUX_SERIAL_MODE; +const char STR_AUX2_SERIAL_MODE[] = TR_AUX2_SERIAL_MODE; const char STR_THROTTLE_LABEL[] = TR_THROTTLE_LABEL; const char STR_SCRIPT[] = TR_SCRIPT; const char STR_INPUTS[] = TR_INPUTS; diff --git a/radio/src/translations.h b/radio/src/translations.h index 6b0038118..3e7536295 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -864,6 +864,7 @@ extern const char STR_SCALE[]; extern const char STR_VIEW_CHANNELS[]; extern const char STR_POTWARNING[]; extern const char STR_AUX_SERIAL_MODE[]; +extern const char STR_AUX2_SERIAL_MODE[]; extern const char STR_THROTTLE_LABEL[]; extern const char STR_SCRIPT[]; extern const char STR_INPUTS[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 08ae06de2..4c04f2bf1 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -981,6 +981,7 @@ #define TR_CHECKLIST TR(INDENT "Poznámky", INDENT "Zobrazit poznámky") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Ofset") #define TR_AUX_SERIAL_MODE "Seriový port" +#define TR_AUX2_SERIAL_MODE "Seriový port 2" #define TR_SCRIPT "Skript" #define TR_INPUTS "Vstupy" #define TR_OUTPUTS "Výstupy" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 62478e7ed..c9e91bd45 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -987,6 +987,7 @@ #define TR_CHECKLIST TR(INDENT "Checkliste", INDENT "Checkliste anzeigen") //9XR-Pro #define TR_FAS_OFFSET TR(INDENT "FAS-Ofs", INDENT "FAS-Offset") #define TR_AUX_SERIAL_MODE "Serieller Port" +#define TR_AUX2_SERIAL_MODE "Serieller Port 2" #define TR_SCRIPT "Lua-Skript" #define TR_INPUTS "Eingaben" #define TR_OUTPUTS "Ausgaben" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 72363c477..e7c30c01e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -985,7 +985,8 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST TR(INDENT "Checklist", INDENT "Display checklist") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS offset") -#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX2_SERIAL_MODE "Serial port 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index b022314fa..428505c1c 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -985,6 +985,7 @@ #define TR_CHECKLIST TR(INDENT "Lista verif", INDENT "Lista verificación") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Puerto serie" +#define TR_AUX2_SERIAL_MODE "Puerto serie 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Entradas" #define TR_OUTPUTS "Salidas" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index afaef5c33..4ff379551 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -999,7 +999,8 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX2_SERIAL_MODE "Serial port 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 422205dd5..e9e87f731 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1002,6 +1002,7 @@ #define TR_CHECKLIST TR(INDENT "Notes", INDENT "Afficher notes") #define TR_FAS_OFFSET TR(INDENT "Corr FAS", INDENT "Correction FAS") #define TR_AUX_SERIAL_MODE "Port série" +#define TR_AUX2_SERIAL_MODE "Port série 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Entrées" #define TR_OUTPUTS "Sorties" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 72223e759..37a494f8a 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1001,7 +1001,8 @@ #define TR_PREFLIGHT "Controlli Prevolo" #define TR_CHECKLIST INDENT "Mostra Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Porta Seriale" +#define TR_AUX_SERIAL_MODE "Porta Seriale" +#define TR_AUX2_SERIAL_MODE "Porta Seriale 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Ingresso" #define TR_OUTPUTS "Uscita" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index f36f75cf1..397cdd636 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -987,7 +987,8 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST TR(INDENT "Checklist", INDENT "Toon Checklist") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Seriele poort" +#define TR_AUX_SERIAL_MODE "Seriele poort" +#define TR_AUX2_SERIAL_MODE "Seriele poort 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 5fd59c2ec..370d757f6 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1000,7 +1000,8 @@ #define TR_PREFLIGHT "Lista Ostrzeżeń" #define TR_CHECKLIST TR(INDENT "Czeklista",INDENT "Pokaż Listę Ostrzeżeń") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Port szreg." +#define TR_AUX_SERIAL_MODE "Port szreg." +#define TR_AUX2_SERIAL_MODE "Port szreg. 2" #define TR_SCRIPT "Skrypt" #define TR_INPUTS "Wejścia" #define TR_OUTPUTS "Wyjścia" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 857bc3c35..a9b5d0027 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -990,7 +990,8 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX2_SERIAL_MODE "Serial port 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index feff5f1d2..1578d86a1 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1000,7 +1000,8 @@ #define TR_PREFLIGHT "Startkontroller" #define TR_CHECKLIST TR(INDENT "Checklista", INDENT "Visa Checklista") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Serieporten" +#define TR_AUX_SERIAL_MODE "Serieporten" +#define TR_AUX2_SERIAL_MODE "Serieporten 2" #define TR_SCRIPT "Programkod" #define TR_INPUTS "Input" #define TR_OUTPUTS "Outputs"