diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 918077619..bb4df9578 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -54,6 +54,7 @@ jobs: - t8 - tlite - t20 + - t14 - tx12 - x10 - x12s @@ -98,6 +99,7 @@ jobs: - t8;zorro;pocket;mt12;commando8 - tlite;tpro;tprov2;lr3pro - t20 + - t14 - tx12;tx12mk2;boxer - tx16s - x10;x10-access diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 4406634ec..a8dfbb3b9 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -22,7 +22,7 @@ jobs: - t18 - t8;zorro;pocket;mt12;commando8 - tlite;tpro;tprov2;lr3pro - - t20 + - t20;t14 - tx12;tx12mk2;boxer - tx16s - x10;x10-access diff --git a/fw.json b/fw.json index b92436535..ae49858e0 100644 --- a/fw.json +++ b/fw.json @@ -27,6 +27,7 @@ ["Jumper T-Pro", "tpro-"], ["Jumper T-Pro V2", "tprov2-"], ["Jumper T20", "t20-"], + ["Jumper T14", "t14-"], ["RadioMaster Boxer", "boxer-"], ["RadioMaster MT12","mt12-"], ["RadioMaster Pocket", "pocket-"], diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index fba828f07..52d64811a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -130,6 +130,9 @@ static inline void check_struct() #elif defined(RADIO_TPROV2) CHKSIZE(RadioData, 859); CHKSIZE(ModelData, 6290); +#elif defined(RADIO_T14) + CHKSIZE(RadioData, 859); + CHKSIZE(ModelData, 6265); #elif defined(RADIO_T20) CHKSIZE(RadioData, 859); CHKSIZE(ModelData, 6326); diff --git a/radio/src/hal/rotary_encoder.h b/radio/src/hal/rotary_encoder.h index b7c4801d8..c81539060 100644 --- a/radio/src/hal/rotary_encoder.h +++ b/radio/src/hal/rotary_encoder.h @@ -27,7 +27,7 @@ #define ROTENC_MIDSPEED 5 #define ROTENC_HIGHSPEED 50 -#if defined(RADIO_T20) +#if defined(RADIO_T20) || defined(RADIO_T14) #define ROTARY_ENCODER_GRANULARITY 4 #else #define ROTARY_ENCODER_GRANULARITY 2 diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index e34b77aed..95142bf4d 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -147,6 +147,17 @@ elseif(PCB STREQUAL X7) add_definitions(-DRADIO_TPROV2) add_definitions(-DMANUFACTURER_JUMPER) set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") + elseif (PCBREV STREQUAL T14) + set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module") + set(INTERNAL_MODULE_SERIAL YES) + set(MODULE_SIZE_SML YES) + set(FLAVOUR t14) + set(NAVIGATION_TYPE x7) + set(ROTARY_ENCODER YES) + set(CPU_TYPE_FULL STM32F407xG) + add_definitions(-DRADIO_T14) + add_definitions(-DMANUFACTURER_JUMPER) + set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") elseif(PCBREV STREQUAL T20) set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module") set(INTERNAL_MODULE_SERIAL YES) @@ -598,7 +609,7 @@ if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCBREV STREQUAL COMMANDO8) targets/common/arm/stm32/sticks_pwm_driver.cpp) endif() -if(PCBREV STREQUAL MT12) +if(PCBREV STREQUAL MT12 OR PCBREV STREQUAL T14) set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/common/arm/stm32/stm32_ws2812.cpp diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 6f5ae9e96..6f8541166 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -161,6 +161,15 @@ #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_12 // PD.12 #define KEYS_GPIO_REG_ENTER GPIOE #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_7 // PE.7 +#elif defined(RADIO_T14) + #define KEYS_GPIO_REG_PAGE GPIOD + #define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_3 // PD.03 + #define KEYS_GPIO_REG_MENU GPIOD + #define KEYS_GPIO_PIN_MENU LL_GPIO_PIN_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOD + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_2 // PD.02 + #define KEYS_GPIO_REG_ENTER GPIOA + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_13 // PA.13 #elif defined(PCBX7) #define KEYS_GPIO_REG_PAGE GPIOD #define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_3 // PD.03 @@ -273,10 +282,10 @@ #define USE_EXTI15_10_IRQ #define EXTI15_10_IRQ_Priority 5 #endif -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET) +#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET) || defined(RADIO_T14) #define ROTARY_ENCODER_NAVIGATION #define ROTARY_ENCODER_GPIO GPIOE - #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.9 + #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.09 #define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_10 // PE.10 #define ROTARY_ENCODER_POSITION() ((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x03) #define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_9 @@ -297,7 +306,7 @@ #if defined(RADIO_TX12) #define ROTARY_ENCODER_SUPPORT_BUGGY_WIRING #endif - #if defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET) + #if defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET) || defined(RADIO_T14) #define ROTARY_ENCODER_INVERTED #endif #endif @@ -411,6 +420,23 @@ #define TRIMS_GPIO_PIN_T5R LL_GPIO_PIN_15 // PE.15 #define TRIMS_GPIO_REG_T5L GPIOE #define TRIMS_GPIO_PIN_T5L LL_GPIO_PIN_14 // PE.14 +#elif defined(RADIO_T14) + #define TRIMS_GPIO_REG_LHL GPIOE + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_3 // PE.03 + #define TRIMS_GPIO_REG_LHR GPIOE + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_4 // PE.04 + #define TRIMS_GPIO_REG_LVD GPIOC + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_3 // PC.03 + #define TRIMS_GPIO_REG_LVU GPIOC + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_2 // PC.02 + #define TRIMS_GPIO_REG_RVD GPIOE + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_6 // PE.06 + #define TRIMS_GPIO_REG_RHL GPIOD + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_15 // PD.15 + #define TRIMS_GPIO_REG_RVU GPIOE + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_5 // PE.05 + #define TRIMS_GPIO_REG_RHR GPIOC + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_1 // PC.01 #elif defined(PCBX7) && !defined(RADIO_COMMANDO8) #define TRIMS_GPIO_REG_LHL GPIOD #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_15 // PD.15 @@ -519,6 +545,11 @@ #define HARDWARE_SWITCH_A #define SWITCHES_GPIO_REG_A GPIOC #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_13 // PC.13 +#elif defined(RADIO_T14) + #define STORAGE_SWITCH_A + #define HARDWARE_SWITCH_A + #define SWITCHES_GPIO_REG_A GPIOC + #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_5 // PC.05 #elif defined(RADIO_T8) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A @@ -613,6 +644,11 @@ #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_15 // PE.15 #define SWITCHES_GPIO_REG_B_H GPIOE #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_7 // PE.07 +#elif defined(RADIO_T14) + #define STORAGE_SWITCH_B + #define HARDWARE_SWITCH_B + #define SWITCHES_GPIO_REG_B GPIOE + #define SWITCHES_GPIO_PIN_B LL_GPIO_PIN_7 // PE.07 #elif defined(RADIO_MT12) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B @@ -662,6 +698,13 @@ #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_0 // PE.00 #define SWITCHES_GPIO_REG_C_H GPIOD #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_11 // PD.11 +#elif defined(RADIO_T14) + #define STORAGE_SWITCH_C + #define HARDWARE_SWITCH_C + #define SWITCHES_GPIO_REG_C_H GPIOE + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_0 // PE.00 + #define SWITCHES_GPIO_REG_C_L GPIOD + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_11 // PD.11 #elif defined(RADIO_TX12) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C @@ -769,6 +812,13 @@ #define HARDWARE_SWITCH_D #define SWITCHES_GPIO_REG_D GPIOD #define SWITCHES_GPIO_PIN_D LL_GPIO_PIN_14 // PD.14 +#elif defined(RADIO_T14) + #define STORAGE_SWITCH_D + #define HARDWARE_SWITCH_D + #define SWITCHES_GPIO_REG_D_L GPIOA + #define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_5 // PA.05 + #define SWITCHES_GPIO_REG_D_H GPIOE + #define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_15 // PE.15 #elif defined(RADIO_T20) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D @@ -863,6 +913,11 @@ #define HARDWARE_SWITCH_E #define SWITCHES_GPIO_REG_E GPIOG #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_10 // PG.10 +#elif defined(RADIO_T14) + #define STORAGE_SWITCH_E + #define HARDWARE_SWITCH_E + #define SWITCHES_GPIO_REG_E GPIOE + #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_8 // PE.08 #elif defined(RADIO_T20) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E @@ -930,6 +985,11 @@ #define HARDWARE_SWITCH_F #define SWITCHES_GPIO_REG_F GPIOG #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_9 // PG.09 +#elif defined(RADIO_T14) + #define STORAGE_SWITCH_F + #define HARDWARE_SWITCH_F + #define SWITCHES_GPIO_REG_F GPIOC + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_13// PC.13 #elif defined(RADIO_T20) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F @@ -991,7 +1051,7 @@ #define HARDWARE_SWITCH_G #define SWITCHES_GPIO_REG_G GPIOD #define SWITCHES_GPIO_PIN_G LL_GPIO_PIN_15 // PD.15 -#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) || defined(RADIO_MT12) || defined(RADIO_POCKET) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) || defined(RADIO_MT12) || defined(RADIO_POCKET) || defined(RADIO_T14) // no SWG #else #define STORAGE_SWITCH_G @@ -1018,8 +1078,8 @@ #define STORAGE_SWITCH_H // no SWH #elif defined(RADIO_TX12) || defined(RADIO_MT12) -#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) - #define STORAGE_SWITCH_H +#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_T14) +#define STORAGE_SWITCH_H #elif defined(RADIO_TPROV2) #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H @@ -1089,8 +1149,8 @@ #define STORAGE_SWITCH_I // no SWJ #define STORAGE_SWITCH_J -#elif defined(RADIO_ZORRO) || defined(RADIO_POCKET) - // No I/J +#elif defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_T14) +// No I/J #elif defined(RADIO_TPROV2) // SW1 #define FUNCTION_SWITCH_1 SI @@ -1456,6 +1516,27 @@ #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 #define ADC_VREF_PREC2 330 +#elif defined(RADIO_T14) + #define HARDWARE_POT1 + #define HARDWARE_POT2 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_0 // PB.00 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_1 // PB.01 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV) + #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_POT2) + #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_8 // ADC12_IN8 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_9 // ADC12_IN9 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 + #define ADC_VREF_PREC2 330 #elif defined(RADIO_TPRO) || defined(RADIO_TPROV2) #define HARDWARE_POT1 #define HARDWARE_POT2 @@ -1632,6 +1713,8 @@ #define ADC_DIRECTION {-1, 1, 1, -1, -1} #elif defined(RADIO_TPRO) || defined(RADIO_TPROV2) #define ADC_DIRECTION {1,-1,1,-1, 1,1, 1, 1} +#elif defined(RADIO_T14) + #define ADC_DIRECTION {1, -1, 1, -1, 1, 1, 1} #elif defined(RADIO_T20) #define ADC_DIRECTION {1,-1,1,-1, -1,1,-1,-1,-1,-1} #elif defined(RADIO_MT12) @@ -1736,6 +1819,16 @@ #define LED_RED_GPIO_PIN GPIO_Pin_13 // PE.13 #define LED_BLUE_GPIO GPIOA #define LED_BLUE_GPIO_PIN GPIO_Pin_7 // PA.07 +#elif defined(RADIO_T14) + #define STATUS_LEDS + #define GPIO_LED_GPIO_ON GPIO_SetBits + #define GPIO_LED_GPIO_OFF GPIO_ResetBits + #define LED_RED_GPIO GPIOE + #define LED_RED_GPIO_PIN GPIO_Pin_2 // PE.02 + #define LED_BLUE_GPIO GPIOE + #define LED_BLUE_GPIO_PIN GPIO_Pin_13 // PE.13 + #define LED_GREEN_GPIO GPIOA + #define LED_GREEN_GPIO_PIN GPIO_Pin_7 // PA.07 #elif defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_TX12) #define STATUS_LEDS #define GPIO_LED_GPIO_ON GPIO_SetBits @@ -1810,6 +1903,20 @@ #define LED_STRIP_TIMER_DMA_IRQn DMA2_Stream5_IRQn #define LED_STRIP_TIMER_DMA_IRQHandler DMA2_Stream5_IRQHandler #define LED_STRIP_REFRESH_PERIOD 50 //ms +#elif defined(RADIO_T14) + #define LED_STRIP_LENGTH 1 + #define LED_STRIP_GPIO GPIOA + #define LED_STRIP_GPIO_PIN_DATA LL_GPIO_PIN_10 // PA.10 / TIM1_CH3 + #define LED_STRIP_GPIO_PIN_AF LL_GPIO_AF_1 + #define LED_STRIP_TIMER TIM1 + #define LED_STRIP_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) + #define LED_STRIP_TIMER_CHANNEL LL_TIM_CHANNEL_CH3 + #define LED_STRIP_TIMER_DMA DMA2 + #define LED_STRIP_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_6 + #define LED_STRIP_TIMER_DMA_STREAM LL_DMA_STREAM_5 + #define LED_STRIP_TIMER_DMA_IRQn DMA2_Stream5_IRQn + #define LED_STRIP_TIMER_DMA_IRQHandler DMA2_Stream5_IRQHandler + #define LED_STRIP_REFRESH_PERIOD 50 //ms #endif #if defined(FUNCTION_SWITCHES) @@ -1911,7 +2018,7 @@ #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 #define INTMODULE_DMA_CHANNEL DMA_Channel_4 -#elif defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) +#elif defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) || defined(RADIO_T14) #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) #define INTMODULE_PWR_GPIO GPIOC #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_4 // PC.04 @@ -1933,8 +2040,13 @@ #define INTMODULE_RX_DMA DMA2 #define INTMODULE_RX_DMA_STREAM LL_DMA_STREAM_2 #define INTMODULE_RX_DMA_CHANNEL LL_DMA_CHANNEL_4 +#if defined(RADIO_T14) + #define INTMODULE_BOOTCMD_GPIO GPIOE + #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_14 // PE.14 +#else #define INTMODULE_BOOTCMD_GPIO GPIOB #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_1 // PB.01 +#endif #define INTMODULE_BOOTCMD_DEFAULT 0 // RESET #define INIT_INTMODULE_BOOTCMD_PIN() GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); #elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7) @@ -2035,8 +2147,8 @@ #endif // External Module -#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(PCBX7ACCESS) || defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) - #if defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) || defined(RADIO_ZORRO)|| defined(RADIO_POCKET) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) +#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(PCBX7ACCESS) || defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) || defined(RADIO_T14) + #if defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) || defined(RADIO_ZORRO)|| defined(RADIO_POCKET) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12)|| defined(RADIO_T14) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 @@ -2370,7 +2482,8 @@ // Trainer / Trainee from the module bay #if defined(PCBX9LITE) || defined(PCBXLITE) || defined(RADIO_X9DP2019) || \ defined(PCBX7ACCESS) || defined(RADIO_ZORRO) || defined(RADIO_POCKET) || \ - defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) + defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) ||\ + defined(RADIO_T14) #define TRAINER_MODULE_CPPM_TIMER TIM3 #define TRAINER_MODULE_CPPM_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) #define TRAINER_MODULE_CPPM_GPIO EXTMODULE_USART_GPIO @@ -2463,7 +2576,7 @@ #define BACKLIGHT_CCMR1 TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 // Channel 1, PWM #define BACKLIGHT_CCER TIM_CCER_CC1E #define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR1 -#elif defined(RADIO_T8) || defined(RADIO_TPROV2) || defined(RADIO_T20) +#elif defined(RADIO_T8) || defined(RADIO_TPROV2) || defined(RADIO_T20) || defined(RADIO_T14) #define BACKLIGHT_RCC_AHB1Periph 0 #define BACKLIGHT_RCC_APB1Periph 0 #define BACKLIGHT_RCC_APB2Periph 0 @@ -2510,10 +2623,13 @@ #if defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_T20) || defined(RADIO_MT12) #define LCD_VERTICAL_INVERT #endif -#if defined(RADIO_LR3PRO) || defined(RADIO_TPROV2) || defined(RADIO_T20) +#if defined(RADIO_LR3PRO) || defined(RADIO_TPROV2) || defined(RADIO_T20) || defined(RADIO_T14) #define LCD_HORIZONTAL_INVERT #define OLED_SCREEN #endif +#if defined(RADIO_T14) + #define SSD1309_LCD +#endif #if defined(PCBX9E) #define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3 @@ -2564,7 +2680,7 @@ #define LCD_MOSI_GPIO_PinSource GPIO_PinSource12 #define LCD_CLK_GPIO_PIN GPIO_Pin_10 // PC.10 #define LCD_CLK_GPIO_PinSource GPIO_PinSource10 - #define LCD_A0_GPIO_PIN GPIO_Pin_11 // PC.11 + #define LCD_A0_GPIO_PIN GPIO_Pin_11 // PC.11 //MOSI #define LCD_NCS_GPIO GPIOA #define LCD_NCS_GPIO_PIN GPIO_Pin_15 // PA.15 #if defined(RADIO_T20) @@ -2595,6 +2711,11 @@ #define LCD_RST_GPIO_PIN GPIO_Pin_12 // PD.12 #endif #define LCD_RCC_APB2Periph 0 +#if defined(SSD1309_LCD) + #define LCD_SPI_PRESCALER SPI_CR1_BR_1 +#else + #define LCD_SPI_PRESCALER 0 +#endif // I2C Bus 1: EEPROM and CAT5137 digital pot for volume control #define I2C_B1 I2C1 @@ -2659,7 +2780,7 @@ #endif // SD - SPI2 -#if defined(RADIO_T20) +#if defined(RADIO_T20) || defined(RADIO_T14) // Using chip, so no detect #else #define SD_PRESENT_GPIO GPIOD @@ -2733,7 +2854,7 @@ #endif // Haptic -#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2)|| defined(RADIO_BOXER) || defined(RADIO_MT12) +#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2)|| defined(RADIO_BOXER) || defined(RADIO_MT12) || defined(RADIO_T14) #define HAPTIC_PWM #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define HAPTIC_RCC_APB1Periph RCC_APB1Periph_TIM2 diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp index 5b8b61f8c..7f213d96e 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -72,7 +72,7 @@ void lcdHardwareInit() // APB1 clock / 2 = 133nS per clock LCD_SPI->CR1 = 0; // Clear any mode error - LCD_SPI->CR1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_CPOL | SPI_CR1_CPHA; + LCD_SPI->CR1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_CPOL | SPI_CR1_CPHA | LCD_SPI_PRESCALER; LCD_SPI->CR2 = 0; LCD_SPI->CR1 |= SPI_CR1_MSTR; // Make sure in case SSM/SSI needed to be set first LCD_SPI->CR1 |= SPI_CR1_SPE; @@ -116,9 +116,44 @@ void lcdHardwareInit() NVIC_EnableIRQ(LCD_DMA_Stream_IRQn); } +#if defined(SSD1309_LCD) +void lcdColumnSet(unsigned char column) +{ + lcdWriteCommand(0x10|(column >> 4)); + lcdWriteCommand(0x00|(column & 0x0f)); +} + +void lcdPageSet(unsigned char page) +{ + lcdWriteCommand(0xb0 + page); +} +#endif + #if LCD_W == 128 void lcdStart() { +#if defined(SSD1309_LCD) + lcdWriteCommand(0xD5); // Set Display Clock Divide Ratio / OSC Frequency + lcdWriteCommand(0x80); // Display Clock Divide Ratio / OSC Frequency + lcdWriteCommand(0xA8); // Set Multiplex Ratio + lcdWriteCommand(0x3F); // Multiplex Ratio for 128x64 (LCD_HEIGHT - 1) + lcdWriteCommand(0xD3); // Set Display Offset + lcdWriteCommand(0x00); // Display Offset (0) + lcdWriteCommand(0x40); // Set Display Start Line (0) + lcdWriteCommand(0x8D); // Set Charge Pump + lcdWriteCommand(0x10); // Charge Pump (0x10 External, 0x14 Internal DC/DC) + lcdWriteCommand(0xA1); // Set Segment Re-Map (Reversed) + lcdWriteCommand(0xC8); // Set Com Output Scan Direction (Reversed) + lcdWriteCommand(0xDA); // Set COM Hardware Configuration + lcdWriteCommand(0x12); // COM Hardware Configuration + lcdWriteCommand(0xD9); // Set Pre-Charge Period + lcdWriteCommand(0x4F); // Set Pre-Charge Period (A[7:4]:Phase 2, A[3:0]:Phase 1) + lcdWriteCommand(0xDB); // Set VCOMH Deselect Level + lcdWriteCommand(0x20); // VCOMH Deselect Level (0x00 ~ 0.65 x VCC, 0x10 ~ 0.71 x VCC, 0x20 ~ 0.77 x VCC, 0x30 ~ 0.83 x VCC) + lcdWriteCommand(0xA4); // Disable Entire Display On + lcdWriteCommand(0xA6); // Set Normal Display (not inverted) + lcdWriteCommand(0x2E); // Deactivate scroll +#else #if defined(LCD_VERTICAL_INVERT) // T12 and TX12 have the screen inverted. lcdWriteCommand(0xe2); // (14) Soft reset @@ -155,6 +190,7 @@ void lcdStart() #else lcdSetRefVolt(g_eeGeneral.contrast); #endif +#endif } #else void lcdStart() @@ -221,10 +257,15 @@ void lcdRefresh(bool wait) lcdWriteCommand(LCD_W_OFFSET); #endif for (uint8_t y=0; y < 8; y++, p+=LCD_W) { +#if defined(SSD1309_LCD) + lcdPageSet(y); + lcdColumnSet(0); +#else lcdWriteCommand(0x10); // Column addr 0 lcdWriteCommand(0xB0 | y); // Page addr y #if !defined(LCD_VERTICAL_INVERT) lcdWriteCommand(0x04); +#endif #endif LCD_NCS_LOW(); @@ -297,6 +338,7 @@ void lcdOff() void lcdReset() { + LCD_NCS_HIGH(); LCD_RST_LOW(); #if LCD_W == 128 delay_ms(150); diff --git a/radio/src/targets/taranis/usb_descriptor.h b/radio/src/targets/taranis/usb_descriptor.h index d33b4067f..721505981 100644 --- a/radio/src/targets/taranis/usb_descriptor.h +++ b/radio/src/targets/taranis/usb_descriptor.h @@ -62,6 +62,10 @@ #define USB_NAME "Jumper TPro V2" #define USB_MANUFACTURER 'J', 'U', 'M', 'P', 'E', 'R', ' ', ' ' /* 8 bytes */ #define USB_PRODUCT 'T', '-', 'P', 'r', 'o', ' ', 'V', '2' /* 8 Bytes */ +#elif defined(RADIO_T14) + #define USB_NAME "Jumper T14" + #define USB_MANUFACTURER 'J', 'U', 'M', 'P', 'E', 'R', ' ', ' ' /* 8 bytes */ + #define USB_PRODUCT 'T', '1', '4', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */ #elif defined(RADIO_T20) #define USB_NAME "Jumper T20" #define USB_MANUFACTURER 'J', 'U', 'M', 'P', 'E', 'R', ' ', ' ' /* 8 bytes */ diff --git a/radio/util/hw_defs/legacy_names.py b/radio/util/hw_defs/legacy_names.py index a313326a7..61d077f85 100644 --- a/radio/util/hw_defs/legacy_names.py +++ b/radio/util/hw_defs/legacy_names.py @@ -297,6 +297,37 @@ LEGACY_NAMES = [ } } }, + { + "targets": {"t14"}, + "inputs": { + "LH": { + "yaml": "Rud" + }, + "LV": { + "yaml": "Ele" + }, + "RV": { + "yaml": "Thr" + }, + "RH": { + "yaml": "Ail" + }, + "P1": { + "yaml": "POT1", + "lua": "s1", + "label": "S1", + "short_label": "1", + "description": "Potentiometer 1" + }, + "P2": { + "yaml": "POT2", + "lua": "s2", + "label": "S2", + "short_label": "2", + "description": "Potentiometer 2" + }, + } + }, { "targets": { "commando8", diff --git a/radio/util/hw_defs/pot_config.py b/radio/util/hw_defs/pot_config.py index de5d8b2a8..e82830e7e 100644 --- a/radio/util/hw_defs/pot_config.py +++ b/radio/util/hw_defs/pot_config.py @@ -58,6 +58,10 @@ POT_CONFIG = { "P1": {"default": "POT"}, "P2": {"default": "POT"} }, + "t14": { + "P1": {"default": "POT_CENTER"}, + "P2": {"default": "POT_CENTER"} + }, "tx12": { "P1": {"default": "POT_CENTER"}, "P2": {"default": "POT_CENTER"} diff --git a/radio/util/hw_defs/switch_config.py b/radio/util/hw_defs/switch_config.py index de3461f53..d8dc2fcf5 100644 --- a/radio/util/hw_defs/switch_config.py +++ b/radio/util/hw_defs/switch_config.py @@ -95,6 +95,16 @@ SWITCH_CONFIG = { "SD": {"default": "3POS", "display": [1, 1]}, "SH": {"default": "2POS", "display": [1, 3]} }, + "t14": { + # left side + "SA": {"default": "2POS", "display": [0, 0]}, + "SC": {"default": "3POS", "display": [0, 1]}, + "SE": {"default": "2POS", "display": [0, 2]}, + # right side + "SB": {"default": "2POS", "display": [1, 0]}, + "SD": {"default": "3POS", "display": [1, 1]}, + "SF": {"default": "TOGGLE", "display": [1, 2]} + }, "t16": { "SA": {"default": "3POS"}, "SB": {"default": "3POS"}, diff --git a/tools/boards.py b/tools/boards.py index e9e7aa6b8..34368651a 100755 --- a/tools/boards.py +++ b/tools/boards.py @@ -74,4 +74,8 @@ boards = { "PCB": "X7", "PCBREV": "T20", }, + "T14": { + "PCB": "X7", + "PCBREV": "T14", + }, } diff --git a/tools/build-companion.sh b/tools/build-companion.sh index d1dc928b6..704833837 100755 --- a/tools/build-companion.sh +++ b/tools/build-companion.sh @@ -128,6 +128,9 @@ do t20) BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20" ;; + t14) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T14" + ;; xlite) BUILD_OPTIONS+="-DPCB=XLITE" ;; diff --git a/tools/build-gh.sh b/tools/build-gh.sh index 16f0aa512..21163ab7f 100755 --- a/tools/build-gh.sh +++ b/tools/build-gh.sh @@ -143,6 +143,9 @@ do t20) BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20" ;; + t14) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T14" + ;; lr3pro) BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=LR3PRO" ;; diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index 1d9c9634f..a3c7d5f4e 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -106,6 +106,9 @@ do t20) BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20" ;; + t14) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T14" + ;; xlite) BUILD_OPTIONS+="-DPCB=XLITE" ;; diff --git a/tools/generate-hw-defs.sh b/tools/generate-hw-defs.sh index 0fbcde6e5..49d60eefa 100755 --- a/tools/generate-hw-defs.sh +++ b/tools/generate-hw-defs.sh @@ -6,7 +6,7 @@ set -e : "${SRCDIR:=$(dirname "$(pwd)/$0")/..}" -: ${FLAVOR:="nv14;t12;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;t20;lr3pro;tx12;tx12mk2;boxer;tx16s;x10;x10-access;x12s;x7;x7-access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites"} +: ${FLAVOR:="nv14;t12;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;t20;t14;lr3pro;tx12;tx12mk2;boxer;tx16s;x10;x10-access;x12s;x7;x7-access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites"} : ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"} # wipe build directory clean @@ -69,6 +69,9 @@ do t20) BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20" ;; + t14) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T14" + ;; lr3pro) BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=LR3PRO" ;; diff --git a/tools/generate-yaml.sh b/tools/generate-yaml.sh index cb834c7a0..5351aaf9d 100755 --- a/tools/generate-yaml.sh +++ b/tools/generate-yaml.sh @@ -71,6 +71,9 @@ do t20) BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20" ;; + t14) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T14" + ;; xlite) BUILD_OPTIONS+="-DPCB=XLITE" ;; diff --git a/tools/msys2_fetch_and_build_all.sh b/tools/msys2_fetch_and_build_all.sh index 60c201fc9..f9a89f2d3 100644 --- a/tools/msys2_fetch_and_build_all.sh +++ b/tools/msys2_fetch_and_build_all.sh @@ -9,7 +9,7 @@ # ----------------------------------------------------------------------------- export BRANCH_NAME="main" # main|2.9|... -export RADIO_TYPE="tx16s" # tx16s|x10|x10-access|x12s|x9d|x9dp|x9lite|x9lites|x7|x7-access|t12|tx12|tx12mk2|boxer|t8|zorro|pocket|tlite|tpro|t20|lr3pro|xlite|xlites|x9dp2019|x9e|x9e-hall|t16|t18|nv14|commando8 +export RADIO_TYPE="tx16s" # tx16s|x10|x10-access|x12s|x9d|x9dp|x9lite|x9lites|x7|x7-access|t12|tx12|tx12mk2|boxer|t8|zorro|pocket|tlite|tpro|t20|t14|lr3pro|xlite|xlites|x9dp2019|x9e|x9e-hall|t16|t18|nv14|commando8 export BUILD_OPTIONS="-DDEFAULT_MODE=2 -DGVARS=YES" @@ -57,6 +57,9 @@ case $RADIO_TYPE in t20) BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=T20" ;; + t14) + BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=T14" + ;; lr3pro) BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=LR3PRO" ;;