diff --git a/radio/src/Makefile b/radio/src/Makefile index 4ce991777..97083ad00 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -620,7 +620,7 @@ ifeq ($(PCB), TARANIS) EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp eeprom_conversions.cpp PULSESSRC = protocols/pulses_arm.cpp protocols/ppm_arm.cpp protocols/pxx_arm.cpp CPPSRC += audio_arm.cpp - CPPSRC += targets/taranis/pwr_driver.cpp targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/delays.cpp targets/taranis/uart_driver.cpp targets/taranis/sport_driver.cpp + CPPSRC += targets/taranis/pwr_driver.cpp targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/delays.cpp targets/taranis/uart3_driver.cpp targets/taranis/sport_driver.cpp CPPSRC += bmp.cpp gui/view_channels.cpp gui/view_about.cpp gui/view_text.cpp SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/misc.c diff --git a/radio/src/debug.h b/radio/src/debug.h index f259d4b11..cd852f852 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -73,7 +73,6 @@ inline void dump(unsigned char *data, unsigned int size) extern "C" { #endif -void debugPutc(const char c); void debugPuts(const char *string, ...); void dump(unsigned char *data, unsigned int size); diff --git a/radio/src/gui/menu_general.cpp b/radio/src/gui/menu_general.cpp index e422861fd..fb8935a28 100644 --- a/radio/src/gui/menu_general.cpp +++ b/radio/src/gui/menu_general.cpp @@ -1200,8 +1200,12 @@ void menuGeneralHardware(uint8_t event) } case ITEM_SETUP_HW_UART3_MODE: - g_eeGeneral.hw_uartMode = selectMenuItem(HW_SETTINGS_COLUMN, y, STR_UART3MODE, STR_UART3MODES, g_eeGeneral.hw_uartMode, 0, 2, attr, event); + g_eeGeneral.uart3Mode = selectMenuItem(HW_SETTINGS_COLUMN, y, STR_UART3MODE, STR_UART3MODES, g_eeGeneral.uart3Mode, 0, UART_MODE_MAX, attr, event); + if (checkIncDec_Ret) { + uart3Init(g_eeGeneral.uart3Mode); + } break; + } } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 0a0eaffcf..40d9980df 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -243,9 +243,20 @@ enum BeeperMode { #endif #if defined(PCBTARANIS) +enum uartModes { + UART_MODE_NONE, + UART_MODE_SPORT, + UART_MODE_VIRTUAL_SP2UART, +#if defined(DEBUG) + UART_MODE_DEBUG, +#endif + UART_MODE_COUNT, + UART_MODE_MAX = UART_MODE_COUNT-1 +}; + #define EXTRA_GENERAL_FIELDS \ EXTRA_GENERAL_FIELDS_ARM \ - uint8_t hw_uartMode; \ + uint8_t uart3Mode; \ uint8_t potsType; #elif defined(CPUARM) #define EXTRA_GENERAL_FIELDS EXTRA_GENERAL_FIELDS_ARM diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index b1d0ef3b0..15bc35ca0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -4972,6 +4972,10 @@ inline void opentxInit(OPENTX_INIT_ARGS) lcdSetContrast(); backlightOn(); +#if defined(PCBTARANIS) + uart3Init(g_eeGeneral.uart3Mode); +#endif + #if defined(CPUARM) init_trainer_capture(); #endif diff --git a/radio/src/simpgmspace.cpp b/radio/src/simpgmspace.cpp index 10c7abd4a..a502dd7f0 100644 --- a/radio/src/simpgmspace.cpp +++ b/radio/src/simpgmspace.cpp @@ -632,6 +632,7 @@ void lcdRefresh() #if defined(PCBTARANIS) void usbStart() { } +void USART_DeInit(USART_TypeDef* ) { } ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) { return SUCCESS; } ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct) { return SUCCESS; } void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) { } diff --git a/radio/src/simpgmspace.h b/radio/src/simpgmspace.h index b177d82a0..d3684200f 100644 --- a/radio/src/simpgmspace.h +++ b/radio/src/simpgmspace.h @@ -406,4 +406,5 @@ extern char simuSdDirectory[1024]; #define SD_GET_SIZE_MB() (0) #define SD_GET_SPEED() (0) + #endif diff --git a/radio/src/targets/sky9x/board_sky9x.h b/radio/src/targets/sky9x/board_sky9x.h index 873d3e7e5..7cde0cfc9 100644 --- a/radio/src/targets/sky9x/board_sky9x.h +++ b/radio/src/targets/sky9x/board_sky9x.h @@ -258,4 +258,7 @@ void rotencEnd(); #define rotencDown() 0 #endif +// Debug driver +void debugPutc(const char c); + #endif diff --git a/radio/src/targets/taranis/board_taranis.cpp b/radio/src/targets/taranis/board_taranis.cpp index 36987fab9..754f6e6c1 100644 --- a/radio/src/targets/taranis/board_taranis.cpp +++ b/radio/src/targets/taranis/board_taranis.cpp @@ -192,9 +192,6 @@ void boardInit() adcInit(); delaysInit(); audioInit(); -#if defined(DEBUG) - uartInit(DEBUG_UART_BAUDRATE); -#endif init5msTimer(); __enable_irq(); eepromInit(); diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 1de2f354d..4bbd2fde0 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -77,11 +77,11 @@ extern uint16_t sessionTimer; void delaysInit(); -#define DEBUG_UART_BAUDRATE 115200 +#define DEBUG_BAUDRATE 115200 #define SPORT_BAUDRATE 57600 -void uartInit(uint32_t baudrate); -void uartPutc(const char c); +void uart3Init(unsigned int mode); +void uart3Putc(const char c); void sportInit(void); @@ -183,6 +183,8 @@ bool usbPlugged(void); void eeWriteBlockCmp(const void *pointer_ram, uint16_t pointer_eeprom, size_t size); #endif +// Debug driver +void debugPutc(const char c); extern uint8_t currentTrainerMode; diff --git a/radio/src/targets/taranis/uart_driver.cpp b/radio/src/targets/taranis/uart3_driver.cpp similarity index 81% rename from radio/src/targets/taranis/uart_driver.cpp rename to radio/src/targets/taranis/uart3_driver.cpp index f084ae8fb..00a0d8891 100644 --- a/radio/src/targets/taranis/uart_driver.cpp +++ b/radio/src/targets/taranis/uart3_driver.cpp @@ -36,7 +36,7 @@ #include "../../opentx.h" -void uartInit(uint32_t baudrate) +void uart3Setup(unsigned int baudrate) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; @@ -69,22 +69,47 @@ void uartInit(uint32_t baudrate) USART_ITConfig(UART3, USART_IT_TXE, DISABLE); NVIC_EnableIRQ(USART3_IRQn); - NVIC_SetPriority(USART3_IRQn, 8); + NVIC_SetPriority(USART3_IRQn, 7); +} + +void uart3Init(unsigned int mode) +{ + USART_DeInit(USART3); + + switch(mode) { + case UART_MODE_SPORT: + uart3Setup(SPORT_BAUDRATE); + break; +#if defined(DEBUG) + case UART_MODE_DEBUG: + uart3Setup(DEBUG_BAUDRATE); + break; +#endif + } +} + +Fifo<512> uart3TxFifo; + +void uart3Putc(const char c) +{ + uart3TxFifo.push(c); + USART_ITConfig(UART3, USART_IT_TXE, ENABLE); } #if defined(DEBUG) -Fifo<512> debugTxFifo; void debugPutc(const char c) { - debugTxFifo.push(c); - USART_ITConfig(UART3, USART_IT_TXE, ENABLE); + if (g_eeGeneral.uart3Mode == UART_MODE_DEBUG) { + uart3Putc(c); + } } +#endif extern "C" void USART3_IRQHandler(void) { if (USART_GetITStatus(UART3, USART_IT_TXE) != RESET) { uint8_t txchar; - if (debugTxFifo.pop(txchar)) { + if (uart3TxFifo.pop(txchar)) { /* Write one byte to the transmit data register */ USART_SendData(UART3, txchar); } @@ -93,4 +118,3 @@ extern "C" void USART3_IRQHandler(void) } } } -#endif diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index dcb6d3693..613f30daa 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -534,6 +534,10 @@ void processSerialData(uint8_t data) btPushByte(data); #endif + if (g_eeGeneral.uart3Mode == UART_MODE_SPORT) { + uart3Putc(data); + } + if (data == START_STOP) { dataState = STATE_DATA_IN_FRAME; numPktBytes = 0; diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 1c9054538..dc3d56e7e 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -69,7 +69,7 @@ #define TR_TRNCHN "CH1CH2CH3CH4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""SPORT Mirror\0 ""Virtual SP2UART" +#define TR_UART3MODES "OFF\0 ""SPORT Mirror\0 ""Virtual SP2UART""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "Pot\0 ""Multipos Switch"