From b78da3436e3f8276b8e1a52555c1329b69e5b3a7 Mon Sep 17 00:00:00 2001 From: richardclli Date: Wed, 11 Sep 2024 15:52:35 +0800 Subject: [PATCH] feat: preliminary HelloRadioSky V14 and V12 radio support (#5494) --- fw.json | 2 + radio/src/targets/taranis/CMakeLists.txt | 33 ++++ radio/src/targets/taranis/board.cpp | 44 +++++- radio/src/targets/taranis/board.h | 4 + radio/src/targets/taranis/hal.h | 155 ++++++++++++++++--- radio/src/targets/taranis/lcd_driver_spi.cpp | 83 +++++++--- radio/src/targets/taranis/usb_descriptor.h | 8 + radio/util/hw_defs/legacy_names.py | 46 ++++++ radio/util/hw_defs/pot_config.py | 10 ++ radio/util/hw_defs/switch_config.py | 20 +++ tools/boards.py | 8 + tools/build-common.sh | 6 + tools/generate-hw-defs.sh | 2 +- 13 files changed, 375 insertions(+), 46 deletions(-) diff --git a/fw.json b/fw.json index bd292a8f5..fa60b1bcd 100644 --- a/fw.json +++ b/fw.json @@ -20,6 +20,8 @@ ["FrSky X9 Lite S", "x9lites-"], ["FrSky X-Lite", "xlite-"], ["FrSky X-Lite S", "xlites-"], + ["HelloRadioSky V12", "v12-"], + ["HelloRadioSky V14", "v14-"], ["HelloRadioSky V16", "v16-"], ["iFlight Commando 8", "commando8-"], ["Jumper T12", "t12-"], diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 99ee74af2..2515cdacb 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -358,6 +358,39 @@ elseif(PCB STREQUAL X7) set(BLUETOOTH YES) set(ROTARY_ENCODER YES) add_definitions(-DMANUFACTURER_FRSKY) + elseif(PCBREV STREQUAL V12) + set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module") + set(INTERNAL_MODULE_SERIAL YES) + set(MODULE_SIZE_STD YES) + set(FLAVOUR v12) + set(NAVIGATION_TYPE x7) + set(CPU_TYPE_FULL STM32F407xG) + set(ROTARY_ENCODER YES) + set(USB_CHARGER YES) + add_definitions(-DRADIO_V12) + add_definitions(-DSTM32_SUPPORT_32BIT_TIMERS) + set(PXX2 ON) + set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") + if (NOT BLUETOOTH) + set(AUX_SERIAL ON) + endif() + elseif(PCBREV STREQUAL V14) + set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module") + set(INTERNAL_MODULE_SERIAL YES) + set(MODULE_SIZE_STD YES) + set(FLAVOUR v14) + set(NAVIGATION_TYPE x7) + set(CPU_TYPE_FULL STM32F407xG) + set(ROTARY_ENCODER YES) + set(USB_CHARGER YES) + add_definitions(-DRADIO_V14) + add_definitions(-DSTM32_SUPPORT_32BIT_TIMERS) + set(PXX2 ON) + set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") + set(FLYSKY_GIMBAL ON) + if (NOT BLUETOOTH) + set(AUX_SERIAL ON) + endif() else() set(DEFAULT_INTERNAL_MODULE XJT_PXX1 CACHE STRING "Default internal module") set(FLAVOUR x7) diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 0e7b8e58d..fa36f2b40 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -61,12 +61,54 @@ HardwareOptions hardwareOptions; +#if defined(LED_STRIP_GPIO) +extern const stm32_pulse_timer_t _led_timer; +#endif + #if !defined(BOOT) #if defined(FUNCTION_SWITCHES) #include "storage/storage.h" #endif +#if defined(SIXPOS_SWITCH_INDEX) +uint8_t lastADCState = 0; +uint8_t sixPosState = 0; +bool dirty = true; +uint16_t getSixPosAnalogValue(uint16_t adcValue) +{ + uint8_t currentADCState = 0; + if (adcValue > 3800) + currentADCState = 6; + else if (adcValue > 3100) + currentADCState = 5; + else if (adcValue > 2300) + currentADCState = 4; + else if (adcValue > 1500) + currentADCState = 3; + else if (adcValue > 1000) + currentADCState = 2; + else if (adcValue > 400) + currentADCState = 1; + if (lastADCState != currentADCState) { + lastADCState = currentADCState; + } else if (lastADCState != 0 && lastADCState - 1 != sixPosState) { + sixPosState = lastADCState - 1; + dirty = true; + } + if (dirty) { + for (uint8_t i = 0; i < 6; i++) { + if (i == sixPosState) + ws2812_set_color(i, SIXPOS_LED_RED, SIXPOS_LED_GREEN, SIXPOS_LED_BLUE); + else + ws2812_set_color(i, 0, 0, 0); + } + ws2812_update(&_led_timer); + } + return (4096/5)*(sixPosState); +} +#endif + void boardInit() { LL_APB1_GRP1_EnableClock(AUDIO_RCC_APB1Periph); @@ -182,8 +224,6 @@ void boardInit() usbInit(); #if defined(LED_STRIP_GPIO) - extern const stm32_pulse_timer_t _led_timer; - ws2812_init(&_led_timer, LED_STRIP_LENGTH, WS2812_GRB); for (uint8_t i = 0; i < LED_STRIP_LENGTH; i++) { ws2812_set_color(i, 0, 0, 50); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index dbb68aa2b..3e7201eb6 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -304,6 +304,10 @@ void usbChargerInit(); bool usbChargerLed(); #endif +#if defined(RADIO_V14) || defined(RADIO_V12) + uint16_t getSixPosAnalogValue(uint16_t adcValue); +#endif + // LED driver void ledInit(); void ledOff(); diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 8cf142852..3ffd3265d 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -93,9 +93,9 @@ #elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET) #if defined(RADIO_MT12) #define KEYS_GPIO_REG_PAGEUP GPIOD - #define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_7 // PD.03 + #define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_7 // PD.07 #define KEYS_GPIO_REG_PAGEDN GPIOD - #define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_3 // PD.07 + #define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_3 // PD.03 #else #define KEYS_GPIO_REG_PAGEUP GPIOD #define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_3 // PD.03 @@ -178,6 +178,21 @@ #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(RADIO_V14) || defined(RADIO_V12) + #define KEYS_GPIO_REG_PAGEUP GPIOD + #define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_3 // PD.03 + #define KEYS_GPIO_REG_PAGEDN GPIOD + #define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOE + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_1 // PE.01 + #define KEYS_GPIO_REG_ENTER GPIOD + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_11 // PD.11 + #define KEYS_GPIO_REG_SYS GPIOB + #define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_4 // PB.04 + #define KEYS_GPIO_REG_MDL GPIOE + #define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_11 // PE.11 + #define KEYS_GPIO_REG_TELE GPIOD + #define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_2 // PD.02 #elif defined(PCBX7) #define KEYS_GPIO_REG_PAGEDN GPIOD #define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_3 // PD.03 @@ -290,7 +305,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) +#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) #define ROTARY_ENCODER_NAVIGATION #define ROTARY_ENCODER_GPIO GPIOE #define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_9 // PE.9 @@ -311,7 +326,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) + #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) #define ROTARY_ENCODER_INVERTED #endif #endif @@ -461,6 +476,23 @@ #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(RADIO_V14) || defined(RADIO_V12) + #define TRIMS_GPIO_REG_LHL GPIOD + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_15 // PD.15 + #define TRIMS_GPIO_REG_LHR GPIOC + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_1 // PC.01 + #define TRIMS_GPIO_REG_LVD GPIOE + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_5 // PE.05 + #define TRIMS_GPIO_REG_RVD GPIOC + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_3 // PC.03 + #define TRIMS_GPIO_REG_RHL GPIOE + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_3 // PE.03 + #define TRIMS_GPIO_REG_RVU GPIOD + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_0 // PD.00 + #define TRIMS_GPIO_REG_RHR GPIOE + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_4 // PE.04 #elif defined(PCBX7) && !defined(RADIO_COMMANDO8) #define TRIMS_GPIO_REG_LHL GPIOD #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_15 // PD.15 @@ -604,6 +636,8 @@ #define SWITCHES_A_INVERTED #define SWITCHES_GPIO_REG_A GPIOD #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_0 // PD.00 +#elif defined(RADIO_V14) || defined(RADIO_V12) + // ADC based switch #elif defined(PCBX7) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A @@ -692,6 +726,8 @@ #define HARDWARE_SWITCH_B #define SWITCHES_GPIO_REG_B GPIOD #define SWITCHES_GPIO_PIN_B LL_GPIO_PIN_11 // PD.11 +#elif defined(RADIO_V14) || defined(RADIO_V12) + // ADC based switch #elif defined(PCBX7) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B @@ -729,7 +765,7 @@ #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_2 // PE.02 #define SWITCHES_GPIO_REG_C_H GPIOE #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_3 // PE.03 -#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) +#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C #define SWITCHES_GPIO_REG_C_L GPIOE @@ -793,6 +829,8 @@ #define HARDWARE_SWITCH_C #define SWITCHES_GPIO_REG_C GPIOC #define SWITCHES_GPIO_PIN_C LL_GPIO_PIN_13 // PC.13 +#elif defined(RADIO_V14) || defined(RADIO_V12) + // ADC based switch #elif defined(PCBX7) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C @@ -879,6 +917,8 @@ #define HARDWARE_SWITCH_D #define SWITCHES_GPIO_REG_D GPIOC #define SWITCHES_GPIO_PIN_D LL_GPIO_PIN_3 // PC.03 +#elif defined(RADIO_V14) || defined(RADIO_V12) + // ADC based switch #elif defined(PCBX7) && !defined(RADIO_COMMANDO8) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D @@ -978,6 +1018,11 @@ #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_3 // PD.03 #elif defined(RADIO_MT12) // ADC based switch/pot +#elif defined(RADIO_V14) || defined(RADIO_V12) + #define STORAGE_SWITCH_E + #define HARDWARE_SWITCH_E + #define SWITCHES_GPIO_REG_E GPIOC + #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_13 // PC.13 #elif defined(PCBX7) // no SWE #else @@ -1060,6 +1105,11 @@ #define STORAGE_SWITCH_F #elif defined(RADIO_T12) // no SWF +#elif defined(RADIO_V14) || defined(RADIO_V12) + #define STORAGE_SWITCH_F + #define HARDWARE_SWITCH_F + #define SWITCHES_GPIO_REG_F GPIOE + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_8 // PE.08 #elif defined(PCBX7) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F @@ -1089,7 +1139,7 @@ #define HARDWARE_SWITCH_G #define SWITCHES_GPIO_REG_G GPIOE #define SWITCHES_GPIO_PIN_G LL_GPIO_PIN_14 // PE.14 -#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) +#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_V14) || defined(RADIO_V12) #define STORAGE_SWITCH_G #elif defined(RADIO_TPROV2) #define STORAGE_SWITCH_G @@ -1136,7 +1186,7 @@ #define STORAGE_SWITCH_H // no SWH #elif defined(RADIO_TX12) || defined(RADIO_MT12) -#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_T14) || defined(RADIO_T12MAX) +#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_V14) || defined(RADIO_V12) #define STORAGE_SWITCH_H #elif defined(RADIO_TPROV2) #define STORAGE_SWITCH_H @@ -1200,7 +1250,7 @@ #define HARDWARE_SWITCH_J #define SWITCHES_GPIO_REG_J GPIOD #define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_14 // PD.14 -#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) +#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) || defined(RADIO_V14) || defined(RADIO_V12) // no headers #elif defined(RADIO_TLITE) || defined(RADIO_LR3PRO) // no SWI @@ -1395,6 +1445,14 @@ #define SWITCHES_GPIO_PIN_R_L LL_GPIO_PIN_0 // PE.00 #endif +// 6POS SW +#if defined(RADIO_V14) || defined(RADIO_V12) + #define SIXPOS_SWITCH_INDEX 6 + #define SIXPOS_LED_RED 255 + #define SIXPOS_LED_GREEN 255 + #define SIXPOS_LED_BLUE 255 +#endif + // ADC #if !defined(RADIO_FAMILY_T20) #define ADC_MAIN ADC1 @@ -1715,6 +1773,33 @@ #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_TH | ADC_GPIO_PIN_STICK_ST | ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_POT4) #define ADC_GPIOC_PINS (ADC_GPIO_PIN_BATT) #define ADC_VREF_PREC2 330 +#elif defined(RADIO_V14) || defined(RADIO_V12) + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_0 // ADC123_IN0 -> ADC1_IN0 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_1 // ADC123_IN1 -> ADC1_IN1 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_2 // ADC123_IN2 -> ADC1_IN2 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_3 // ADC123_IN3 -> ADC1_IN3 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_0 // PB.00 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_6 // PA.06 + #define ADC_GPIO_PIN_POT3 LL_GPIO_PIN_2 // PC.02 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_8 // ADC12_IN8 -> ADC1_IN8 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_6 // ADC12_IN6 -> ADC1_IN6 + #define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_12 // ADC123_IN12 -> ADC1_IN12 + #define ADC_GPIO_PIN_SWA LL_GPIO_PIN_7 // PA.07 + #define ADC_GPIO_PIN_SWB LL_GPIO_PIN_5 // PA.05 + #define ADC_GPIO_PIN_SWC LL_GPIO_PIN_0 // PC.00 + #define ADC_GPIO_PIN_SWD LL_GPIO_PIN_5 // PC.05 + #define ADC_CHANNEL_SWA LL_ADC_CHANNEL_7 // ADC12_IN7 -> ADC1_IN7 + #define ADC_CHANNEL_SWB LL_ADC_CHANNEL_5 // ADC12_IN5 -> ADC1_IN5 + #define ADC_CHANNEL_SWC LL_ADC_CHANNEL_10 // ADC123_IN10 -> ADC1_IN10 + #define ADC_CHANNEL_SWD LL_ADC_CHANNEL_15 // ADC12_IN15 -> ADC1_IN15 + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_SWA | ADC_GPIO_PIN_SWB) + #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT1) + #define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_SWC | ADC_GPIO_PIN_SWD) + #define ADC_VREF_PREC2 330 #elif defined(PCBX7) #define HARDWARE_POT1 #define HARDWARE_POT2 @@ -1731,7 +1816,7 @@ #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_6 // PA.06 #endif #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 -#if defined(RADIO_BOXER) +#if defined(RADIO_BOXER) || defined(RADIO_V14) || defined(RADIO_V12) #define HARDWARE_POT3 // 6 POS #define ADC_GPIO_PIN_POT3 LL_GPIO_PIN_5 // PA.05 #define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_5 @@ -1821,6 +1906,10 @@ #define ADC_DIRECTION {1,-1,1,-1, -1,1,-1,-1,-1,-1} #elif defined(RADIO_MT12) #define ADC_DIRECTION {1,-1, -1,-1, 0, 0, 0, 0} +#elif defined(RADIO_V14) + #define ADC_DIRECTION {1,-1,1,-1, -1,-1,1, 0, 1,1,1,1 } +#elif defined(RADIO_V12) + #define ADC_DIRECTION {1,-1,1,-1, -1,-1,1, 0, 1,1,1,1 } #elif defined(PCBX7) #define ADC_DIRECTION {-1,1,-1,1, 1,1, 1, 1} #elif defined(PCBX9LITE) @@ -1843,6 +1932,9 @@ #elif defined(RADIO_FAMILY_T20) #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) + #define PWR_SWITCH_GPIO GPIO_PIN(GPIOD, 1) // PD.01 + #define PWR_ON_GPIO GPIO_PIN(GPIOB, 2) // PB.02 #else #define PWR_SWITCH_GPIO GPIO_PIN(GPIOD, 1) // PD.01 #define PWR_ON_GPIO GPIO_PIN(GPIOD, 0) // PD.00 @@ -1921,6 +2013,13 @@ #define LED_GREEN_GPIO GPIO_PIN(GPIOA, 7) // PA.07 #define LED_RED_GPIO GPIO_PIN(GPIOE, 13) // PE.13 #define LED_BLUE_GPIO GPIO_PIN(GPIOE, 2) // PE.02 +#elif defined(RADIO_V14) || defined(RADIO_V12) + #define STATUS_LEDS + #define GPIO_LED_GPIO_ON gpio_set + #define GPIO_LED_GPIO_OFF gpio_clear + #define LED_GREEN_GPIO GPIO_PIN(GPIOE, 14) // PE.14 + #define LED_RED_GPIO GPIO_PIN(GPIOE, 13) // PE.13 + #define LED_BLUE_GPIO GPIO_PIN(GPIOE, 2) // PE.02 #elif defined(PCBX7) #define STATUS_LEDS #define GPIO_LED_GPIO_ON gpio_set @@ -1943,6 +2042,7 @@ #define LED_BLUE_GPIO GPIO_PIN(GPIOE, 6) // PE.06 #endif + // LED Strip #if defined(RADIO_MT12) #define LED_STRIP_LENGTH 7 #define LED_STRIP_GPIO GPIO_PIN(GPIOA, 8) // PA.08 / TIM1_CH1 @@ -1956,8 +2056,14 @@ #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) +#elif defined(RADIO_T14) || defined(RADIO_V14) || defined(RADIO_V12) +#if defined(RADIO_V14) + #define LED_STRIP_LENGTH 38 +#elif defined(RADIO_V12) + #define LED_STRIP_LENGTH 6 +#else #define LED_STRIP_LENGTH 1 +#endif #define LED_STRIP_GPIO GPIO_PIN(GPIOA, 10) // PA.10 / TIM1_CH3 #define LED_STRIP_GPIO_AF LL_GPIO_AF_1 #define LED_STRIP_TIMER TIM1 @@ -2041,7 +2147,8 @@ #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) +#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) + #if defined(RADIO_T20V2) #define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOE, 4) // PE.04 #define INTMODULE_PWR_GPIO GPIO_PIN(GPIOC, 6) // PC.06 @@ -2053,7 +2160,11 @@ #endif #define INTMODULE_PWR_GPIO GPIO_PIN(GPIOC, 4) // PC.04 #endif - #define INTMODULE_BOOTCMD_DEFAULT 0 // RESET +#if defined(RADIO_V14) || defined(RADIO_V12) + #define INTMODULE_BOOTCMD_DEFAULT 1 // RESET +#else + #define INTMODULE_BOOTCMD_DEFAULT 0 // RESET +#endif #define INTMODULE_TX_GPIO GPIO_PIN(GPIOB, 6) // PB.06 #define INTMODULE_RX_GPIO GPIO_PIN(GPIOB, 7) // PB.07 #define INTMODULE_USART USART1 @@ -2134,8 +2245,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) - #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) +#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) + #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) #define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 8) // PD.08 #elif defined(PCBX9LITE) #define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOA, 8) // PA.08 @@ -2166,6 +2277,10 @@ #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) + #define EXTMODULE_TX_INVERT_GPIO GPIO_PIN(GPIOE, 7) // PE.07 + #define EXTMODULE_RX_INVERT_GPIO GPIO_PIN(GPIOE, 15) // PE.15 + #endif #else #if defined(RADIO_COMMANDO8) #define EXTMODULE_RF_SWITCH_GPIO GPIO_PIN(GPIOE, 7) // Antenna switching: PE.07 @@ -2268,6 +2383,10 @@ #else #define TELEMETRY_SET_INPUT 0 #endif +#if defined(RADIO_V14) || 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 #define TELEMETRY_TX_GPIO GPIO_PIN(GPIOD, 5) // PD.05 #define TELEMETRY_RX_GPIO GPIO_PIN(GPIOD, 6) // PD.06 #define TELEMETRY_USART USART2 @@ -2389,7 +2508,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_T14) || defined(RADIO_T12MAX) || defined(RADIO_V14) || defined(RADIO_V12) #define TRAINER_MODULE_CPPM_TIMER TIM3 #define TRAINER_MODULE_CPPM_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) #define TRAINER_MODULE_CPPM_GPIO EXTMODULE_RX_GPIO @@ -2479,7 +2598,7 @@ #endif // LCD driver -#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_TPROS) || defined(RADIO_FAMILY_T20) || defined(RADIO_MT12) || defined(RADIO_T12MAX) +#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_TPROS) || defined(RADIO_FAMILY_T20) || defined(RADIO_MT12) || defined(RADIO_T12MAX) || defined(RADIO_V14) || defined(RADIO_V12) #define LCD_VERTICAL_INVERT #endif #if defined(RADIO_LR3PRO) || defined(RADIO_TPROV2) || defined(RADIO_TPROS) || defined(RADIO_FAMILY_T20) || defined(RADIO_T14) @@ -2667,7 +2786,7 @@ #endif // Haptic -#if defined(PCBXLITE) || defined(PCBX9LITE) || 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) +#if defined(PCBXLITE) || defined(PCBX9LITE) || 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) #define HAPTIC_PWM #define HAPTIC_GPIO GPIO_PIN(GPIOB, 3) // PB.03 #define HAPTIC_GPIO_AF GPIO_AF1 @@ -2699,7 +2818,7 @@ #define HAPTIC_GPIO GPIO_PIN(GPIOC, 12) // PC.12 #endif -#if defined(RADIO_BOXER) || defined(RADIO_FAMILY_T20) || defined(RADIO_X9DP2019) +#if defined(RADIO_BOXER) || defined(RADIO_FAMILY_T20) || defined(RADIO_X9DP2019) || defined (RADIO_V14) // 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 8e9a81b63..94342f6ed 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -37,7 +37,7 @@ #if defined(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) +#elif defined(RADIO_FAMILY_JUMPER_T12) || defined(MANUFACTURER_RADIOMASTER) || defined(RADIO_COMMANDO8) || defined(RADIO_TPRO) || defined(RADIO_T12MAX) || defined(RADIO_V12) || defined(RADIO_V14) #define LCD_CONTRAST_OFFSET -10 #else #define LCD_CONTRAST_OFFSET 160 @@ -148,34 +148,62 @@ void lcdStart() #else #if defined(LCD_VERTICAL_INVERT) // T12 and TX12 have the screen inverted. - lcdWriteCommand(0xe2); // (14) Soft reset + #if defined(RADIO_V12) + lcdWriteCommand(0xe2); // (14) Soft reset + lcdWriteCommand(0xa0); // Set seg + lcdWriteCommand(0xc8); // Set com + lcdWriteCommand(0xf8); // Set booster + lcdWriteCommand(0x00); // 5x + lcdWriteCommand(0xa2); // Set bias=1/6 + lcdWriteCommand(0x26); // Set internal rb/ra=5.0 + lcdWriteCommand(0x2f); // All built-in power circuits on + lcdWriteCommand(0x81); // Set contrast + lcdWriteCommand(0x1F); // Set Vop + lcdWriteCommand(0xa6); // Set display mode + #else + lcdWriteCommand(0xe2); // (14) Soft reset #if defined(LCD_HORIZONTAL_INVERT) - lcdWriteCommand(0xa1); // Set seg + lcdWriteCommand(0xa1); // Set seg #else - lcdWriteCommand(0xa0); // Set seg + lcdWriteCommand(0xa0); // Set seg #endif - lcdWriteCommand(0xc8); // Set com - lcdWriteCommand(0xf8); // Set booster - lcdWriteCommand(0x00); // 5x - lcdWriteCommand(0xa3); // Set bias=1/6 - lcdWriteCommand(0x22); // Set internal rb/ra=5.0 - lcdWriteCommand(0x2f); // All built-in power circuits on - lcdWriteCommand(0x24); // Power control set - lcdWriteCommand(0x81); // Set contrast - lcdWriteCommand(0x0A); // Set Vop - lcdWriteCommand(0xa6); // Set display mode + lcdWriteCommand(0xc8); // Set com + lcdWriteCommand(0xf8); // Set booster + lcdWriteCommand(0x00); // 5x + lcdWriteCommand(0xa3); // Set bias=1/6 + lcdWriteCommand(0x22); // Set internal rb/ra=5.0 + lcdWriteCommand(0x2f); // All built-in power circuits on + lcdWriteCommand(0x24); // Power control set + lcdWriteCommand(0x81); // Set contrast + lcdWriteCommand(0x0A); // Set Vop + lcdWriteCommand(0xa6); // Set display mode + #endif #else - lcdWriteCommand(0xe2); // (14) Soft reset - lcdWriteCommand(0xa1); // Set seg - lcdWriteCommand(0xc0); // Set com - lcdWriteCommand(0xf8); // Set booster - lcdWriteCommand(0x00); // 5x - lcdWriteCommand(0xa3); // Set bias=1/6 - lcdWriteCommand(0x22); // Set internal rb/ra=5.0 - lcdWriteCommand(0x2f); // All built-in power circuits on - lcdWriteCommand(0x81); // Set contrast - lcdWriteCommand(0x36); // Set Vop - lcdWriteCommand(0xa6); // Set display mode + #if defined(RADIO_V14) + lcdWriteCommand(0xe2); // (14) Soft reset + lcdWriteCommand(0xa1); // Set seg + lcdWriteCommand(0xc0); // Set com + lcdWriteCommand(0xf8); // Set booster + lcdWriteCommand(0x00); // 5x + lcdWriteCommand(0xa2); // Set bias=1/6 + lcdWriteCommand(0x26); // Set internal rb/ra=5.0 + lcdWriteCommand(0x2f); // All built-in power circuits on + lcdWriteCommand(0x81); // Set contrast + lcdWriteCommand(0x1F); // Set Vop + lcdWriteCommand(0xa6); // Set display mode + #else + lcdWriteCommand(0xe2); // (14) Soft reset + lcdWriteCommand(0xa1); // Set seg + lcdWriteCommand(0xc0); // Set com + lcdWriteCommand(0xf8); // Set booster + lcdWriteCommand(0x00); // 5x + lcdWriteCommand(0xa3); // Set bias=1/6 + lcdWriteCommand(0x22); // Set internal rb/ra=5.0 + lcdWriteCommand(0x2f); // All built-in power circuits on + lcdWriteCommand(0x81); // Set contrast + lcdWriteCommand(0x36); // Set Vop + lcdWriteCommand(0xa6); // Set display mode + #endif #endif #if defined(BOOT) lcdSetRefVolt(LCD_CONTRAST_DEFAULT); @@ -408,8 +436,13 @@ void lcdSetRefVolt(uint8_t val) WAIT_FOR_DMA_END(); #endif +#if defined(RADIO_V12) || defined(RADIO_V14) + lcdWriteCommand(0x81); // Set Vop + lcdWriteCommand(val+LCD_CONTRAST_OFFSET+20);// 0-255 +#else lcdWriteCommand(0x81); // Set Vop lcdWriteCommand(val+LCD_CONTRAST_OFFSET); // 0-255 +#endif } #if LCD_W == 128 diff --git a/radio/src/targets/taranis/usb_descriptor.h b/radio/src/targets/taranis/usb_descriptor.h index fd1680a05..8be765b22 100644 --- a/radio/src/targets/taranis/usb_descriptor.h +++ b/radio/src/targets/taranis/usb_descriptor.h @@ -85,6 +85,14 @@ #define USB_NAME "iFlight Commando 8" #define USB_MANUFACTURER 'i', 'F', 'l', 'i', 'g', 'h', 't', '-' /* 8 bytes */ #define USB_PRODUCT 'C', 'o', 'm', 'm', 'a', 'n', 'd', 'o' /* 8 Bytes */ +#elif defined(RADIO_V12) + #define USB_NAME "HelloRadioSky V12" + #define USB_MANUFACTURER 'H', 'R', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ + #define USB_PRODUCT 'V', '1', '2', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */ +#elif defined(RADIO_V14) + #define USB_NAME "HelloRadioSky V14" + #define USB_MANUFACTURER 'H', 'R', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ + #define USB_PRODUCT 'V', '1', '4', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */ #else #define USB_NAME "FrSky Taranis" #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ diff --git a/radio/util/hw_defs/legacy_names.py b/radio/util/hw_defs/legacy_names.py index 9df9ff6bb..9932712e0 100644 --- a/radio/util/hw_defs/legacy_names.py +++ b/radio/util/hw_defs/legacy_names.py @@ -626,6 +626,52 @@ LEGACY_NAMES = [ } } }, + { + "targets": {"v12", "v14"}, + "inputs": { + "LH": { + "yaml": "Rud", + "lua": "rud", + "description": "Rudder" + }, + "LV": { + "yaml": "Ele", + "lua": "ele", + "description": "Elevator" + }, + "RV": { + "yaml": "Thr", + "lua": "thr", + "description": "Throttle" + }, + "RH": { + "yaml": "Ail", + "lua": "ail", + "description": "Aileron" + }, + "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" + }, + "P3": { + "yaml": "POT3", + "lua": "s3", + "label": "S3", + "short_label": "3", + "description": "6 pos" + } + } + }, { "targets": {"t20","t20v2"}, "inputs": { diff --git a/radio/util/hw_defs/pot_config.py b/radio/util/hw_defs/pot_config.py index 7ee4447a4..c28c3a545 100644 --- a/radio/util/hw_defs/pot_config.py +++ b/radio/util/hw_defs/pot_config.py @@ -32,6 +32,16 @@ POT_CONFIG = { "EXT3": {"default": "MULTIPOS"}, "EXT4": {"default": "MULTIPOS"} }, + "v12": { + "P1": {"default": "POT_CENTER"}, + "P2": {"default": "POT_CENTER"}, + "P3": {"default": "MULTIPOS"}, + }, + "v14": { + "P1": {"default": "POT_CENTER"}, + "P2": {"default": "POT_CENTER"}, + "P3": {"default": "MULTIPOS"}, + }, "v16": { "P1": {"default": "POT_CENTER"}, "P2": {"default": "MULTIPOS"}, diff --git a/radio/util/hw_defs/switch_config.py b/radio/util/hw_defs/switch_config.py index a15cf7482..0cc530e2c 100644 --- a/radio/util/hw_defs/switch_config.py +++ b/radio/util/hw_defs/switch_config.py @@ -69,6 +69,26 @@ SWITCH_CONFIG = { "SG": {"default": "3POS"}, "SH": {"default": "TOGGLE"} }, + "v12": { + # left side + "SA": {"default": "3POS", "display": [0, 0]}, + "SB": {"default": "3POS", "display": [0, 1]}, + "SE": {"default": "2POS", "display": [0, 2]}, + # right side + "SC": {"default": "3POS", "display": [1, 0]}, + "SD": {"default": "3POS", "display": [1, 1]}, + "SF": {"default": "TOGGLE", "display": [1, 2]}, + }, + "v14": { + # left side + "SA": {"default": "3POS", "display": [0, 0]}, + "SB": {"default": "3POS", "display": [0, 1]}, + "SE": {"default": "2POS", "display": [0, 2]}, + # right side + "SC": {"default": "3POS", "display": [1, 0]}, + "SD": {"default": "3POS", "display": [1, 1]}, + "SF": {"default": "TOGGLE", "display": [1, 2]}, + }, "v16": { "SA": {"default": "3POS"}, "SB": {"default": "3POS"}, diff --git a/tools/boards.py b/tools/boards.py index 31793506c..b8ae44ccb 100755 --- a/tools/boards.py +++ b/tools/boards.py @@ -68,6 +68,14 @@ boards = { "PCBREV": "F16", "INTERNAL_MODULE_MULTI": "YES" }, + "V12": { + "PCB": "X7", + "PCBREV": "V12", + }, + "V14": { + "PCB": "X7", + "PCBREV": "V14", + }, "V16": { "PCB": "X10", "PCBREV": "V16", diff --git a/tools/build-common.sh b/tools/build-common.sh index 34c63ee5e..75d4af930 100644 --- a/tools/build-common.sh +++ b/tools/build-common.sh @@ -116,6 +116,12 @@ get_target_build_options() { f16) BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=F16" ;; + v12) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=V12" + ;; + v14) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=V14" + ;; v16) BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=V16" ;; diff --git a/tools/generate-hw-defs.sh b/tools/generate-hw-defs.sh index 0d38d5f43..86b0ff550 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;t12;t12max;t15;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;t20;t20v2;t14;lr3pro;mt12;tx12;tx12mk2;boxer;tx16s;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16"} +: ${FLAVOR:="nv14;el18;t12;t12max;t15;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;t20;t20v2;t14;lr3pro;mt12;tx12;tx12mk2;boxer;tx16s;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v14;v12"} : ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"} # wipe build directory clean