From c966bee5f2abfd8dd76a2bd4b59e7c283880de29 Mon Sep 17 00:00:00 2001 From: helloradiosky <157123396+helloradiosky@users.noreply.github.com> Date: Wed, 15 Jul 2026 11:37:05 +0800 Subject: [PATCH] feat: add HRS V14 LCD variant (#7480) Co-authored-by: Peter Feerick <5500713+pfeerick@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug-report.yml | 2 + .github/workflows/build_fw.yml | 2 +- .github/workflows/companion.yml | 2 +- .github/workflows/nightly.yml | 2 +- companion/src/firmwares/boards.cpp | 8 + companion/src/firmwares/boards.h | 7 + .../src/firmwares/opentx/opentxinterface.cpp | 7 + fw.json | 1 + radio/src/boards/hw_defs/v14lcd.json | 397 ++++++++++++++++++ radio/src/targets/taranis/CMakeLists.txt | 8 +- radio/src/targets/taranis/hal.h | 30 +- radio/src/targets/taranis/lcd_driver_spi.cpp | 6 +- radio/src/targets/taranis/usb_descriptor.h | 4 + radio/util/build-firmware.py | 5 + radio/util/hw_defs/legacy_names.py | 2 +- tools/boards.py | 4 + tools/build-common.sh | 3 + tools/build-wasm-modules.sh | 2 +- tools/generate-hw-defs.sh | 2 +- 19 files changed, 468 insertions(+), 26 deletions(-) create mode 100644 radio/src/boards/hw_defs/v14lcd.json diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index b6c2b31e8..5c2235ab2 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -61,6 +61,7 @@ body: - 2.12.2 - 2.12.1 - 2.12.0 + - 2.11.6 - 2.11.5 - 2.11.4 - 2.11.3 @@ -111,6 +112,7 @@ body: - FrSky X-Lite / S / Pro - HelloRadioSky V12 - HelloRadioSky V14 + - HelloRadioSky V14LCD - HelloRadioSky V16 - Jumper T12 - Jumper T14 diff --git a/.github/workflows/build_fw.yml b/.github/workflows/build_fw.yml index 51da145f4..202d614c0 100644 --- a/.github/workflows/build_fw.yml +++ b/.github/workflows/build_fw.yml @@ -87,7 +87,7 @@ jobs: - t12max;tx12mk2;boxer - tx15;tx16s - x12s;f16 - - v12;v14;v16 + - v14;v14lcd;v16 - x10;x10express - x7access;x9dp2019;x9e;x9e-hall - nb4p;st16 diff --git a/.github/workflows/companion.yml b/.github/workflows/companion.yml index 68b1989df..acc0f7546 100644 --- a/.github/workflows/companion.yml +++ b/.github/workflows/companion.yml @@ -53,7 +53,7 @@ jobs: - id: color-3 target: [tx15, tx16s, x12s, f16] - id: mixed-1 - target: [v12, v14, v16, x10, x10express] + target: [v14, v14lcd, v16, x10, x10express] - id: bw-3 target: [x7access, x9dp2019, x9e, x9e-hall] - id: color-4 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 47d73a857..7536c66ac 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -28,7 +28,7 @@ jobs: - tx16s - tx16smk3 - f16 - - v16 + - v14;v14lcd;v16 - x10;x10express - x12s - x7access diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 6c44b735d..8195d114e 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -163,6 +163,8 @@ uint32_t Boards::getFourCC(Type board) return 0x4C78746F; case BOARD_HELLORADIOSKY_V14: return 0x4D78746F; + case BOARD_HELLORADIOSKY_V14LCD: + return 0x4F78746F; case BOARD_HELLORADIOSKY_V16: return 0x4E78746F; default: @@ -205,6 +207,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_RADIOMASTER_MT12: case BOARD_RADIOMASTER_GX12: case BOARD_HELLORADIOSKY_V14: + case BOARD_HELLORADIOSKY_V14LCD: return EESIZE_TARANIS; case BOARD_UNKNOWN: return EESIZE_MAX; @@ -263,6 +266,7 @@ int Boards::getFlashSize(Type board) case BOARD_RADIOMASTER_POCKET: return FSIZE_512KB; case BOARD_HELLORADIOSKY_V14: + case BOARD_HELLORADIOSKY_V14LCD: case BOARD_JUMPER_BUMBLEBEE: case BOARD_JUMPER_T12MAX: case BOARD_JUMPER_T14: @@ -666,6 +670,8 @@ QString Boards::getBoardName(Board::Type board) return "HelloRadioSky V16"; case BOARD_HELLORADIOSKY_V14: return "HelloRadioSky V14"; + case BOARD_HELLORADIOSKY_V14LCD: + return "HelloRadioSky V14LCD"; default: return CPN_STR_UNKNOWN_ITEM; } @@ -772,6 +778,7 @@ int Boards::getDefaultInternalModules(Board::Type board) case BOARD_BETAFPV_LR3PRO: case BOARD_FATFISH_F16: case BOARD_HELLORADIOSKY_V14: + case BOARD_HELLORADIOSKY_V14LCD: case BOARD_HELLORADIOSKY_V16: case BOARD_RADIOMASTER_TX15: case BOARD_RADIOMASTER_TX16SMK3: @@ -813,6 +820,7 @@ void Boards::getBattRange(Board::Type board, int& vmin, int& vmax, unsigned int& { switch (board) { case BOARD_HELLORADIOSKY_V14: + case BOARD_HELLORADIOSKY_V14LCD: case BOARD_JUMPER_T12: case BOARD_JUMPER_T14: case BOARD_JUMPER_TPRO: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 8950ab68c..466ff4c0c 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -98,6 +98,7 @@ namespace Board { BOARD_HELLORADIOSKY_V16, BOARD_RADIOMASTER_MT12, BOARD_HELLORADIOSKY_V14, + BOARD_HELLORADIOSKY_V14LCD, BOARD_TYPE_COUNT, BOARD_TYPE_MAX = BOARD_TYPE_COUNT - 1 }; @@ -659,6 +660,11 @@ inline bool IS_HELLORADIOSKY_V14(Board::Type board) return board == Board::BOARD_HELLORADIOSKY_V14; } +inline bool IS_HELLORADIOSKY_V14LCD(Board::Type board) +{ + return board == Board::BOARD_HELLORADIOSKY_V14LCD; +} + inline bool IS_HELLORADIOSKY_V16(Board::Type board) { return board == Board::BOARD_HELLORADIOSKY_V16; @@ -681,6 +687,7 @@ inline bool IS_FAMILY_T12(Board::Type board) { return board == Board::BOARD_BETAFPV_LR3PRO || board == Board::BOARD_HELLORADIOSKY_V14 || + board == Board::BOARD_HELLORADIOSKY_V14LCD || board == Board::BOARD_IFLIGHT_COMMANDO8 || board == Board::BOARD_JUMPER_BUMBLEBEE || board == Board::BOARD_JUMPER_T12 || diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index e717c4ee4..7e28d68d3 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -502,6 +502,13 @@ void registerOpenTxFirmwares() registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); + /* HelloRadioSky V14LCD board */ + firmware = new OpenTxFirmware(FIRMWAREID("v14lcd"), Firmware::tr("HelloRadioSky V14LCD"), BOARD_HELLORADIOSKY_V14LCD); + addOpenTxCommonOptions(firmware); + addOpenTxFontOptions(firmware); + registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); + /* HelloRadioSky V16 board */ firmware = new OpenTxFirmware(FIRMWAREID("v16"), Firmware::tr("HelloRadioSky V16"), BOARD_HELLORADIOSKY_V16); addOpenTxFrskyOptions(firmware); diff --git a/fw.json b/fw.json index 846fbaf6f..ba067d41f 100644 --- a/fw.json +++ b/fw.json @@ -17,6 +17,7 @@ ["FrSky X9E", "x9e-"], ["FrSky X9E Hall", "x9e-hall-"], ["HelloRadioSky V14", "v14-"], + ["HelloRadioSky V14LCD", "v14lcd-"], ["HelloRadioSky V16", "v16-"], ["iFlight Commando 8", "commando8-"], ["Jumper Bumblebee", "bumblebee-"], diff --git a/radio/src/boards/hw_defs/v14lcd.json b/radio/src/boards/hw_defs/v14lcd.json new file mode 100644 index 000000000..d1df9446d --- /dev/null +++ b/radio/src/boards/hw_defs/v14lcd.json @@ -0,0 +1,397 @@ +{ + "adc_inputs": { + "adcs": [ + { + "name": "MAIN", + "adc": "ADC1", + "dma": "DMA2", + "dma_channel": "LL_DMA_CHANNEL_0", + "dma_stream": "LL_DMA_STREAM_4", + "dma_stream_irq": "DMA2_Stream4_IRQn", + "dma_stream_irq_handler": "DMA2_Stream4_IRQHandler", + "sample_time": "LL_ADC_SAMPLINGTIME_28CYCLES" + }, + { + "name": "EXT", + "adc": "ADC3", + "dma": "DMA2", + "dma_channel": "LL_DMA_CHANNEL_2", + "dma_stream": "LL_DMA_STREAM_0", + "dma_stream_irq": "DMA2_Stream0_IRQn", + "dma_stream_irq_handler": "DMA2_Stream0_IRQHandler", + "sample_time": "LL_ADC_SAMPLINGTIME_56CYCLES" + } + ], + "inputs": [ + { + "name": "LH", + "type": "STICK", + "adc": "MAIN", + "gpio": "GPIOA", + "pin": "LL_GPIO_PIN_2", + "channel": "LL_ADC_CHANNEL_2" + }, + { + "name": "LV", + "type": "STICK", + "adc": "MAIN", + "gpio": "GPIOA", + "pin": "LL_GPIO_PIN_3", + "channel": "LL_ADC_CHANNEL_3", + "inverted": true + }, + { + "name": "RV", + "type": "STICK", + "adc": "MAIN", + "gpio": "GPIOA", + "pin": "LL_GPIO_PIN_0", + "channel": "LL_ADC_CHANNEL_0" + }, + { + "name": "RH", + "type": "STICK", + "adc": "MAIN", + "gpio": "GPIOA", + "pin": "LL_GPIO_PIN_1", + "channel": "LL_ADC_CHANNEL_1", + "inverted": true + }, + { + "name": "P1", + "type": "FLEX", + "adc": "MAIN", + "gpio": "GPIOB", + "pin": "LL_GPIO_PIN_0", + "channel": "LL_ADC_CHANNEL_8", + "inverted": true, + "label": "S1", + "short_label": "1", + "default": "POT_CENTER" + }, + { + "name": "P2", + "type": "FLEX", + "adc": "MAIN", + "gpio": "GPIOA", + "pin": "LL_GPIO_PIN_6", + "channel": "LL_ADC_CHANNEL_6", + "inverted": true, + "label": "S2", + "short_label": "2", + "default": "POT_CENTER" + }, + { + "name": "P3", + "type": "FLEX", + "adc": "EXT", + "gpio": "GPIOC", + "pin": "LL_GPIO_PIN_2", + "channel": "LL_ADC_CHANNEL_12", + "label": "S3", + "short_label": "3", + "default": "MULTIPOS" + }, + { + "name": "RTC_BAT", + "type": "RTC_BAT", + "adc": "MAIN", + "gpio": null, + "pin": null, + "channel": "LL_ADC_CHANNEL_VBAT" + }, + { + "name": "SWB", + "type": "SWITCH", + "adc": "MAIN", + "gpio": "GPIOA", + "pin": "LL_GPIO_PIN_5", + "channel": "LL_ADC_CHANNEL_5" + }, + { + "name": "SWC", + "type": "SWITCH", + "adc": "MAIN", + "gpio": "GPIOC", + "pin": "LL_GPIO_PIN_0", + "channel": "LL_ADC_CHANNEL_10" + }, + { + "name": "SWE", + "type": "SWITCH", + "adc": "MAIN", + "gpio": "GPIOA", + "pin": "LL_GPIO_PIN_7", + "channel": "LL_ADC_CHANNEL_7" + }, + { + "name": "SWF", + "type": "SWITCH", + "adc": "MAIN", + "gpio": "GPIOC", + "pin": "LL_GPIO_PIN_5", + "channel": "LL_ADC_CHANNEL_15" + } + ] + }, + "switches": [ + { + "name": "SA", + "type": "2POS", + "flags": 0, + "inverted": false, + "default": "TOGGLE", + "display": [ + 0, + 0 + ], + "gpio": "GPIOC", + "pin": "LL_GPIO_PIN_13", + "is_cfs": false + }, + { + "name": "SB", + "type": "ADC", + "flags": 0, + "inverted": false, + "default": "3POS", + "display": [ + 0, + 1 + ], + "adc_input": "SWB", + "is_cfs": false + }, + { + "name": "SC", + "type": "ADC", + "flags": 0, + "inverted": false, + "default": "3POS", + "display": [ + 1, + 0 + ], + "adc_input": "SWC", + "is_cfs": false + }, + { + "name": "SD", + "type": "2POS", + "flags": 0, + "inverted": false, + "default": "TOGGLE", + "display": [ + 1, + 1 + ], + "gpio": "GPIOE", + "pin": "LL_GPIO_PIN_8", + "is_cfs": false + }, + { + "name": "SE", + "type": "ADC", + "flags": 0, + "inverted": false, + "default": "2POS", + "display": [ + 0, + 2 + ], + "adc_input": "SWE", + "is_cfs": false + }, + { + "name": "SF", + "type": "ADC", + "flags": 0, + "inverted": false, + "default": "TOGGLE", + "display": [ + 1, + 2 + ], + "adc_input": "SWF", + "is_cfs": false + } + ], + "keys": [ + { + "gpio": "GPIOE", + "pin": "LL_GPIO_PIN_1", + "active_low": true, + "key": "KEY_EXIT", + "name": "EXIT", + "label": "EXIT" + }, + { + "gpio": "GPIOD", + "pin": "LL_GPIO_PIN_11", + "active_low": true, + "key": "KEY_ENTER", + "name": "ENTER", + "label": "Enter" + }, + { + "gpio": "GPIOD", + "pin": "LL_GPIO_PIN_3", + "active_low": true, + "key": "KEY_PAGEUP", + "name": "PAGEUP", + "label": "PAGE<" + }, + { + "gpio": "GPIOD", + "pin": "LL_GPIO_PIN_7", + "active_low": true, + "key": "KEY_PAGEDN", + "name": "PAGEDN", + "label": "PAGE>" + }, + { + "gpio": "GPIOE", + "pin": "LL_GPIO_PIN_11", + "active_low": true, + "key": "KEY_MODEL", + "name": "MDL", + "label": "MDL" + }, + { + "gpio": "GPIOD", + "pin": "LL_GPIO_PIN_2", + "active_low": true, + "key": "KEY_TELE", + "name": "TELE", + "label": "TELE" + }, + { + "gpio": "GPIOB", + "pin": "LL_GPIO_PIN_4", + "active_low": true, + "key": "KEY_SYS", + "name": "SYS", + "label": "SYS" + } + ], + "trims": [ + { + "name": "T1", + "dec": { + "gpio": "GPIOD", + "pin": "LL_GPIO_PIN_15", + "active_low": true + }, + "inc": { + "gpio": "GPIOC", + "pin": "LL_GPIO_PIN_1", + "active_low": true + }, + "active_low": true + }, + { + "name": "T2", + "dec": { + "gpio": "GPIOE", + "pin": "LL_GPIO_PIN_6", + "active_low": true + }, + "inc": { + "gpio": "GPIOE", + "pin": "LL_GPIO_PIN_5", + "active_low": true + }, + "active_low": true + }, + { + "name": "T3", + "dec": { + "gpio": "GPIOC", + "pin": "LL_GPIO_PIN_3", + "active_low": true + }, + "inc": { + "gpio": "GPIOD", + "pin": "LL_GPIO_PIN_0", + "active_low": true + }, + "active_low": true + }, + { + "name": "T4", + "dec": { + "gpio": "GPIOE", + "pin": "LL_GPIO_PIN_3", + "active_low": true + }, + "inc": { + "gpio": "GPIOE", + "pin": "LL_GPIO_PIN_4", + "active_low": true + }, + "active_low": true + } + ], + "display": { + "lcd_w": 128, + "lcd_h": 64, + "lcd_phys_w": 128, + "lcd_phys_h": 64, + "lcd_depth": 1, + "lcd_horizontal_invert": true + }, + "backlight": { + "backlight_bdtr": "TIM_BDTR_MOE" + }, + "leds": { + "led_strip_length": 38, + "bling_led_strip_start": 6, + "bling_led_strip_length": 32, + "led_strip_gpio": "GPIO_PIN(GPIOA, 10)", + "led_strip_gpio_af": "LL_GPIO_AF_1", + "led_strip_timer": "TIM1", + "led_strip_timer_freq": "(PERI2_FREQUENCY * TIMER_MULT_APB2)", + "led_strip_timer_channel": "LL_TIM_CHANNEL_CH3", + "led_strip_timer_dma": "DMA2", + "led_strip_timer_dma_channel": "LL_DMA_CHANNEL_6", + "led_strip_timer_dma_stream": "LL_DMA_STREAM_5", + "led_strip_timer_dma_irqn": "DMA2_Stream5_IRQn", + "led_strip_timer_dma_irqhandler": "DMA2_Stream5_IRQHandler", + "led_strip_refresh_period": 50, + "status_leds": true, + "led_red_gpio": "GPIO_PIN(GPIOE, 13)", + "led_green_gpio": "GPIO_PIN(GPIOE, 14)", + "led_blue_gpio": "GPIO_PIN(GPIOE, 2)" + }, + "hardware": { + "has_ext_module_support": true, + "has_int_module_support": true, + "sport_max_baudrate": 400000, + "cpu": "STM32F407xG", + "cpu_type": "STM32F4" + }, + "timers": { + "cpu_freq": 168000000, + "peri1_frequency": 42000000, + "peri2_frequency": 84000000, + "timer_mult_apb1": 2, + "timer_mult_apb2": 2, + "ms_timer": "TIM14", + "ms_timer_irqn": "TIM8_TRG_COM_TIM14_IRQn", + "ms_timer_irqhandler": "TIM8_TRG_COM_TIM14_IRQHandler", + "mixer_scheduler_timer": "TIM12", + "mixer_scheduler_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "mixer_scheduler_timer_irqn": "TIM8_BRK_TIM12_IRQn", + "mixer_scheduler_timer_irqhandler": "TIM8_BRK_TIM12_IRQHandler" + }, + "haptic": { + "haptic_pwm": true, + "haptic_gpio": "GPIO_PIN(GPIOB, 3)", + "haptic_gpio_af": "GPIO_AF1", + "haptic_timer": "TIM2", + "haptic_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "haptic_counter_register": "HAPTIC_TIMER->CCR2", + "haptic_ccmr1": "TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2", + "haptic_ccer": "TIM_CCER_CC2E" + } +} diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 22f4d0edb..25f7624c4 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -373,11 +373,15 @@ elseif(PCB STREQUAL X7) if (NOT BLUETOOTH) set(AUX_SERIAL ON) endif() - elseif(PCBREV STREQUAL V14) + elseif(PCBREV STREQUAL V14 OR PCBREV STREQUAL V14LCD) set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module") set(INTERNAL_MODULE_SERIAL YES) set(MODULE_SIZE_STD YES) - set(FLAVOUR v14) + if(PCBREV STREQUAL V14LCD) + set(FLAVOUR v14lcd) + else() + set(FLAVOUR v14) + endif() set(CPU_TYPE_FULL STM32F407xG) set(ROTARY_ENCODER YES) set(USB_CHARGER YES) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index cb3fc88ea..433dbef38 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -104,7 +104,7 @@ #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) || defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V12) || defined(RADIO_GX12) +#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET) || defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) || defined(RADIO_GX12) #define ROTARY_ENCODER_NAVIGATION #define ROTARY_ENCODER_GPIO GPIOE #define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_9 // PE.9 @@ -125,7 +125,7 @@ #define USE_EXTI15_10_IRQ #define EXTI15_10_IRQ_Priority 5 #endif - #if defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET) || defined(RADIO_T14) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V12) + #if defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET) || defined(RADIO_T14) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) #define ROTARY_ENCODER_INVERTED #endif #endif @@ -137,7 +137,7 @@ #endif // 6POS SW -#if defined(RADIO_V14) || defined(RADIO_V12) +#if defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) #define SIXPOS_SWITCH_INDEX 6 #define SIXPOS_LED_RED 200 #define SIXPOS_LED_GREEN 0 @@ -192,7 +192,7 @@ #define ADC_VREF_PREC2 330 #elif defined(RADIO_GX12) #define ADC_VREF_PREC2 330 -#elif defined(RADIO_V12) || defined(RADIO_V14) +#elif defined(RADIO_V12) || defined(RADIO_V14) || defined(RADIO_V14LCD) #define ADC_VREF_PREC2 330 #elif defined(PCBX7) #define ADC_VREF_PREC2 330 @@ -220,7 +220,7 @@ #elif defined(RADIO_FAMILY_T20) || defined(RADIO_BUMBLEBEE) #define PWR_SWITCH_GPIO GPIO_PIN(GPIOG, 5) // PG.05 #define PWR_ON_GPIO GPIO_PIN(GPIOG, 6) // PG.06 -#elif defined(RADIO_V14) || defined(RADIO_V12) +#elif defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) #define PWR_SWITCH_GPIO GPIO_PIN(GPIOD, 1) // PD.01 #define PWR_ON_GPIO GPIO_PIN(GPIOB, 2) // PB.02 #else @@ -263,7 +263,7 @@ #endif // Switches with LEDs -#if defined(RADIO_V14) +#if defined(RADIO_V14) || defined(RADIO_V14LCD) #define SALED_PWR_GPIO GPIO_PIN(GPIOC, 13) // PD.14 #define SALED_PWR_ON() gpio_set(SALED_PWR_GPIO) #define SDLED_PWR_GPIO GPIO_PIN(GPIOE, 8) // PD.14 @@ -316,7 +316,7 @@ #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler #define INTMODULE_DMA_CHANNEL LL_DMA_CHANNEL_4 -#elif defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) || defined(RADIO_T20V2) || defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V12) || defined(RADIO_GX12) || defined(RADIO_BUMBLEBEE) +#elif defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) || defined(RADIO_T20V2) || defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) || defined(RADIO_GX12) || defined(RADIO_BUMBLEBEE) #if defined(RADIO_T20V2) || defined(RADIO_BUMBLEBEE) #define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOE, 4) // PE.04 #define INTMODULE_PWR_GPIO GPIO_PIN(GPIOC, 6) // PC.06 @@ -328,7 +328,7 @@ #endif #define INTMODULE_PWR_GPIO GPIO_PIN(GPIOC, 4) // PC.04 #endif -#if defined(RADIO_V14) || defined(RADIO_V12) +#if defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) #define INTMODULE_BOOTCMD_DEFAULT 1 // RESET #else #define INTMODULE_BOOTCMD_DEFAULT 0 // RESET @@ -413,8 +413,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) || defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V12) || defined(RADIO_T12MAX) || defined(RADIO_GX12) - #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) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V12) +#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) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) || defined(RADIO_T12MAX) || defined(RADIO_GX12) + #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) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) #define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 8) // PD.08 #elif defined(PCBX9LITE) #define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOA, 8) // PA.08 @@ -447,7 +447,7 @@ #define EXTMODULE_USART_TX_DMA_STREAM LL_DMA_STREAM_6 #define EXTMODULE_USART_RX_DMA_CHANNEL LL_DMA_CHANNEL_5 #define EXTMODULE_USART_RX_DMA_STREAM LL_DMA_STREAM_1 - #if defined(RADIO_V14) || defined(RADIO_V12) + #if defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) #define EXTMODULE_TX_INVERT_GPIO GPIO_PIN(GPIOE, 7) // PE.07 #define EXTMODULE_RX_INVERT_GPIO GPIO_PIN(GPIOE, 15) // PE.15 #endif @@ -563,7 +563,7 @@ #else #define TELEMETRY_SET_INPUT 0 #endif -#if defined(RADIO_V14) || defined(RADIO_V12) +#if defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) #define TELEMETRY_RX_REV_GPIO GPIO_PIN(GPIOE, 0) // PE.00 #define TELEMETRY_TX_REV_GPIO GPIO_PIN(GPIOE, 0) // PE.00 #endif @@ -688,7 +688,7 @@ #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_T14) || defined(RADIO_T12MAX) || defined(RADIO_V14) || defined(RADIO_V12) \ + defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_V12) \ || defined(RADIO_GX12) #define TRAINER_MODULE_CPPM_TIMER TIM3 #define TRAINER_MODULE_CPPM_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) @@ -852,7 +852,7 @@ #if defined(PCBXLITE) || defined(PCBX9LITE) || defined(PCBX7ACCESS) || \ defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_X9DP2019) || \ - defined(RADIO_GX12) || defined(RADIO_V12) || defined(RADIO_V14) + defined(RADIO_GX12) || defined(RADIO_V12) || defined(RADIO_V14) || defined(RADIO_V14LCD) #define I2C_B1_SCL_GPIO GPIO_PIN(GPIOB, 8) // PB.08 #define I2C_B1_SDA_GPIO GPIO_PIN(GPIOB, 9) // PB.09 #else @@ -975,7 +975,7 @@ #endif #endif -#if defined(RADIO_BOXER) || defined(RADIO_FAMILY_T20) || defined(RADIO_X9DP2019) || defined (RADIO_V14) || defined(RADIO_GX12) +#if defined(RADIO_BOXER) || defined(RADIO_FAMILY_T20) || defined(RADIO_X9DP2019) || defined (RADIO_V14) || defined(RADIO_V14LCD) || defined(RADIO_GX12) // Flysky Hall Stick #define FLYSKY_HALL_SERIAL_USART UART4 #define FLYSKY_HALL_SERIAL_GPIO GPIOA diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp index df899e60e..ada36f5c7 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -37,7 +37,7 @@ #if OLED_SCREEN #define LCD_CONTRAST_OFFSET 0 -#elif defined(RADIO_FAMILY_JUMPER_T12) || defined(MANUFACTURER_RADIOMASTER) || defined(RADIO_COMMANDO8) || defined(RADIO_TPRO) || defined(RADIO_T12MAX) || defined(RADIO_V12) || defined(RADIO_V14) +#elif defined(RADIO_FAMILY_JUMPER_T12) || defined(MANUFACTURER_RADIOMASTER) || defined(RADIO_COMMANDO8) || defined(RADIO_TPRO) || defined(RADIO_T12MAX) || defined(RADIO_V12) || defined(RADIO_V14) || defined(RADIO_V14LCD) #define LCD_CONTRAST_OFFSET -10 #else #define LCD_CONTRAST_OFFSET 160 @@ -191,7 +191,7 @@ void lcdStart() lcdWriteCommand(0xa6); // Set display mode #endif #else - #if defined(RADIO_V14) + #if defined(RADIO_V14) || defined(RADIO_V14LCD) lcdWriteCommand(0xe2); // (14) Soft reset lcdWriteCommand(0xa1); // Set seg lcdWriteCommand(0xc0); // Set com @@ -453,7 +453,7 @@ void lcdSetRefVolt(uint8_t val) WAIT_FOR_DMA_END(); #endif -#if defined(RADIO_V12) || defined(RADIO_V14) +#if defined(RADIO_V12) || defined(RADIO_V14) || defined(RADIO_V14LCD) lcdWriteCommand(0x81); // Set Vop lcdWriteCommand(val+LCD_CONTRAST_OFFSET+20);// 0-255 #else diff --git a/radio/src/targets/taranis/usb_descriptor.h b/radio/src/targets/taranis/usb_descriptor.h index 16486677b..cb83161da 100644 --- a/radio/src/targets/taranis/usb_descriptor.h +++ b/radio/src/targets/taranis/usb_descriptor.h @@ -101,6 +101,10 @@ #define USB_NAME "HelloRadioSky V14" #define USB_MANUFACTURER 'H', 'R', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ #define USB_PRODUCT 'V', '1', '4', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */ +#elif defined(RADIO_V14LCD) + #define USB_NAME "HelloRadioSky V14LCD" + #define USB_MANUFACTURER 'H', 'R', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ + #define USB_PRODUCT 'V', '1', '4', 'L', 'C', 'D', ' ', ' ' /* 8 Bytes */ #else #define USB_NAME "FrSky Taranis" #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 0e669b4d1..3e2f6f0de 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -209,6 +209,11 @@ def main(): cmake_options["PCBREV"] = "V14" firmware_options = options_helloradiosky_v14 maxsize = 65536 * 8 * 2 + elif board_name == "v14lcd": + cmake_options["PCB"] = "X7" + cmake_options["PCBREV"] = "V14LCD" + firmware_options = options_helloradiosky_v14 + maxsize = 65536 * 8 * 2 elif board_name == "v16": cmake_options["PCB"] = "X10" cmake_options["PCBREV"] = "V16" diff --git a/radio/util/hw_defs/legacy_names.py b/radio/util/hw_defs/legacy_names.py index 1be38b086..f2dad9fd5 100644 --- a/radio/util/hw_defs/legacy_names.py +++ b/radio/util/hw_defs/legacy_names.py @@ -776,7 +776,7 @@ LEGACY_NAMES = [ } }, { - "targets": {"v12", "v14"}, + "targets": {"v12", "v14", "v14lcd"}, "inputs": { "LH": { "yaml": "Rud", diff --git a/tools/boards.py b/tools/boards.py index b8ae44ccb..2d44eb3c0 100755 --- a/tools/boards.py +++ b/tools/boards.py @@ -76,6 +76,10 @@ boards = { "PCB": "X7", "PCBREV": "V14", }, + "V14LCD": { + "PCB": "X7", + "PCBREV": "V14LCD", + }, "V16": { "PCB": "X10", "PCBREV": "V16", diff --git a/tools/build-common.sh b/tools/build-common.sh index 782e40461..3e04784ee 100644 --- a/tools/build-common.sh +++ b/tools/build-common.sh @@ -137,6 +137,9 @@ get_target_build_options() { v14) BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=V14" ;; + v14lcd) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=V14LCD" + ;; v16) BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=V16" ;; diff --git a/tools/build-wasm-modules.sh b/tools/build-wasm-modules.sh index fca745365..d24166c6e 100755 --- a/tools/build-wasm-modules.sh +++ b/tools/build-wasm-modules.sh @@ -223,7 +223,7 @@ else boxer bumblebee commando8 gx12 mt12 pocket t12max t14 t20 t20v2 tpros tprov2 - tx12mk2 zorro v12 v14 + tx12mk2 zorro v12 v14 v14lcd x7access x9dp2019 x9e # colour el18 nb4p nv14 st16 pa01 diff --git a/tools/generate-hw-defs.sh b/tools/generate-hw-defs.sh index 9b64af25d..17f315ad0 100755 --- a/tools/generate-hw-defs.sh +++ b/tools/generate-hw-defs.sh @@ -9,7 +9,7 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" : "${SRCDIR:=$(dirname "$(pwd)/$0")/..}" -: ${FLAVOR:="nv14;el18;pl18;pl18ev;pl18u;nb4p;st16;pa01;t12;t12max;t15;t15pro;t22;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;bumblebee;t20;t20v2;t14;lr3pro;mt12;gx12;tx12;tx12mk2;boxer;tx16s;tx16smk3;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v16;v14;v12;tx15"} +: ${FLAVOR:="nv14;el18;pl18;pl18ev;pl18u;nb4p;st16;pa01;t12;t12max;t15;t15pro;t22;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;bumblebee;t20;t20v2;t14;lr3pro;mt12;gx12;tx12;tx12mk2;boxer;tx16s;tx16smk3;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v16;v14;v14lcd;v12;tx15"} : ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"} # wipe build directory clean