From 48d0ec49edd96c7670e5259149089b412402d14f Mon Sep 17 00:00:00 2001 From: Richard Li Date: Fri, 29 Mar 2024 17:18:57 +0800 Subject: [PATCH] Current works: LCD, touch, ST, TH, some switches --- radio/src/targets/pl18/CMakeLists.txt | 7 +- radio/src/targets/pl18/backlight_driver.cpp | 8 +- radio/src/targets/pl18/battery_driver.cpp | 2 + radio/src/targets/pl18/battery_driver.h | 6 +- radio/src/targets/pl18/board.cpp | 10 ++- radio/src/targets/pl18/hal.h | 87 ++++++++++++++++++++- radio/src/targets/pl18/key_driver.cpp | 4 + radio/src/targets/pl18/touch_driver.cpp | 48 +++++++++--- radio/util/hw_defs/legacy_names.py | 45 ++++------- radio/util/hw_defs/pot_config.py | 3 +- radio/util/hw_defs/switch_config.py | 8 +- 11 files changed, 168 insertions(+), 60 deletions(-) diff --git a/radio/src/targets/pl18/CMakeLists.txt b/radio/src/targets/pl18/CMakeLists.txt index 43fbca566..25c319f3d 100644 --- a/radio/src/targets/pl18/CMakeLists.txt +++ b/radio/src/targets/pl18/CMakeLists.txt @@ -18,7 +18,6 @@ set(RTC_BACKUP_RAM YES) set(PPM_LIMITS_SYMETRICAL YES) set(USB_SERIAL ON CACHE BOOL "Enable USB serial (CDC)") set(HARDWARE_EXTERNAL_MODULE YES) -set(WIRELESS_CHARGER YES) #option(STICKS_DEAD_ZONE "Enable sticks dead zone" YES) #option(AFHDS2 "Support for AFHDS2" OFF) @@ -46,9 +45,14 @@ if(PCBREV STREQUAL NB4P) elseif(PCBREV STREQUAL PL18EV) set(FLAVOUR pl18ev) add_definitions(-DRADIO_PL18EV) + set(WIRELESS_CHARGER YES) + set(FLYSKY_GIMBAL ON) + set(ROTARY_ENCODER YES) else() set(FLAVOUR pl18) add_definitions(-DRADIO_PL18) + set(WIRELESS_CHARGER YES) + set(FLYSKY_GIMBAL ON) # Defines internal modules for PL18 via UART7 set(INTERNAL_MODULES MULTI CACHE STRING "Internal modules") @@ -65,7 +69,6 @@ set(FIRMWARE_DEPENDENCIES datacopy) set(HARDWARE_TOUCH ON) set(SOFTWARE_KEYBOARD ON) -set(FLYSKY_GIMBAL ON) add_definitions( -DSTM32F429_439xx -DSTM32F429xx diff --git a/radio/src/targets/pl18/backlight_driver.cpp b/radio/src/targets/pl18/backlight_driver.cpp index 3f72815f6..38216247b 100644 --- a/radio/src/targets/pl18/backlight_driver.cpp +++ b/radio/src/targets/pl18/backlight_driver.cpp @@ -40,13 +40,12 @@ void backlightInit() // PIN init gpio_init_af(BACKLIGHT_GPIO, BACKLIGHT_GPIO_AF, GPIO_PIN_SPEED_LOW); - // TODO review this when the timer will be chosen stm32_timer_enable_clock(BACKLIGHT_TIMER); BACKLIGHT_TIMER->ARR = 100; BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 1000000 - 1; // 10kHz (same as FrOS) BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE; // PWM mode 1 BACKLIGHT_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC1NE; - BACKLIGHT_TIMER->CCR1 = 100; // 100% on init + BACKLIGHT_TIMER->CCR1 = 0; BACKLIGHT_TIMER->EGR = TIM_EGR_UG; BACKLIGHT_TIMER->CR1 |= TIM_CR1_CEN; // Counter enable BACKLIGHT_TIMER->BDTR |= TIM_BDTR_MOE; @@ -68,6 +67,11 @@ void backlightEnable(uint8_t dutyCycle) lastDutyCycle = dutyCycle; } +void backlightFullOn() +{ + backlightEnable(BACKLIGHT_LEVEL_MAX); +} + void lcdOff() { backlightEnable(0); } diff --git a/radio/src/targets/pl18/battery_driver.cpp b/radio/src/targets/pl18/battery_driver.cpp index f0ad2a93e..aa9797d35 100644 --- a/radio/src/targets/pl18/battery_driver.cpp +++ b/radio/src/targets/pl18/battery_driver.cpp @@ -273,7 +273,9 @@ void battery_charge_init() // USB charger control pins +#if defined(UCHARGER_EN_GPIO) gpio_init(UCHARGER_EN_GPIO, GPIO_OUT, GPIO_PIN_SPEED_LOW); +#endif // USB charger state init ENABLE_UCHARGER(); diff --git a/radio/src/targets/pl18/battery_driver.h b/radio/src/targets/pl18/battery_driver.h index 60460686c..020b8a4a2 100644 --- a/radio/src/targets/pl18/battery_driver.h +++ b/radio/src/targets/pl18/battery_driver.h @@ -44,9 +44,13 @@ enum ChargeState #define IS_UCHARGER_ACTIVE() gpio_read(UCHARGER_GPIO) ? 1 : 0 #define IS_UCHARGER_CHARGE_END_ACTIVE() gpio_read(UCHARGER_CHARGE_END_GPIO) ? 1 : 0 +#if defined(UCHARGER_EN_GPIO) #define ENABLE_UCHARGER() gpio_set(UCHARGER_EN_GPIO) #define DISABLE_UCHARGER() gpio_clear(UCHARGER_EN_GPIO) - +#else +#define ENABLE_UCHARGER() +#define DISABLE_UCHARGER() +#endif #define IS_WCHARGER_ACTIVE() gpio_read(WCHARGER_GPIO) ? 1 : 0 #define IS_WCHARGER_CHARGE_END_ACTIVE() gpio_read(WCHARGER_CHARGE_END_GPIO) ? 1 : 0 #define ENABLE_WCHARGER() gpio_set(WCHARGER_EN_GPIO) diff --git a/radio/src/targets/pl18/board.cpp b/radio/src/targets/pl18/board.cpp index 77091b174..a5fec0026 100644 --- a/radio/src/targets/pl18/board.cpp +++ b/radio/src/targets/pl18/board.cpp @@ -42,7 +42,9 @@ #include "touch.h" #include "debug.h" -#include "flysky_gimbal_driver.h" +#if defined(FLYSKY_GIMBAL) + #include "flysky_gimbal_driver.h" +#endif #include "timers_driver.h" #include "battery_driver.h" @@ -109,7 +111,11 @@ void boardInit() board_trainer_init(); battery_charge_init(); - flysky_gimbal_init(); + + #if defined(FLYSKY_GIMBAL) + flysky_gimbal_init(); + #endif + timersInit(); touchPanelInit(); usbInit(); diff --git a/radio/src/targets/pl18/hal.h b/radio/src/targets/pl18/hal.h index e0ad68d54..d728c55d7 100644 --- a/radio/src/targets/pl18/hal.h +++ b/radio/src/targets/pl18/hal.h @@ -51,6 +51,7 @@ // PL18/PL18EV only has virtual keys via trim buttons // #define KEYS_GPIO_PIN_PGUP /* for activating PGUP in keys diagnose screen */ +#if !defined(RADIO_NB4P) // Trims #define TRIMS_GPIO_REG_LHL #define TRIMS_GPIO_PIN_LHL @@ -303,16 +304,64 @@ } #endif +#else + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) + #define ADC_RCC_APB1Periph 0 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_TH LL_GPIO_PIN_3 // PA.03 + #define ADC_GPIO_PIN_STICK_ST LL_GPIO_PIN_2 // PA.02 + #define ADC_CHANNEL_STICK_TH LL_ADC_CHANNEL_3 // ADC123_IN3 -> ADC1_IN3 + #define ADC_CHANNEL_STICK_ST LL_ADC_CHANNEL_2 // ADC123_IN2 -> ADC1_IN2 + #define ADC_GPIO_PIN_SWA LL_GPIO_PIN_1 //PC.01 + #define ADC_GPIO_PIN_SWB LL_GPIO_PIN_0 //PC.00 + #define ADC_CHANNEL_SWA LL_ADC_CHANNEL_11 // ADC123_IN11 -> ADC1_IN11 + #define ADC_CHANNEL_SWB LL_ADC_CHANNEL_10 // ADC123_IN10 -> ADC1_IN10 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_7 // PA.07 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_2 // PC.02 + #define ADC_GPIO_PIN_POT3 LL_GPIO_PIN_6 // PA.06 + #define ADC_GPIO_PIN_POT4 LL_GPIO_PIN_4 // PC.04 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_5 // PC.05 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_7 // ADC12_IN7 -> ADC1_IN7 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_12 // ADC123_IN12 -> ADC1_IN12 + #define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_6 // ADC12_IN6 -> ADC1_IN6 + #define ADC_CHANNEL_POT4 LL_ADC_CHANNEL_14 // ADC12_IN14 -> ADC1_IN14 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_15 // ADC12_IN15 -> ADC1_IN15 + #define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC1_IN18 + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_TH | ADC_GPIO_PIN_STICK_ST | ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_POT3) + #define ADC_GPIOC_PINS (ADC_GPIO_PIN_SWA | ADC_GPIO_PIN_SWB | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT4 | ADC_GPIO_PIN_BATT) + +#define ADC_MAIN ADC1 +#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_28CYCLES +#define ADC_DMA DMA2 +#define ADC_DMA_CHANNEL LL_DMA_CHANNEL_0 +#define ADC_DMA_STREAM LL_DMA_STREAM_4 +#define ADC_DMA_STREAM_IRQ DMA2_Stream4_IRQn +#define ADC_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler + +#define ADC_VREF_PREC2 660 + +#define ADC_DIRECTION { \ + 0,0, /* gimbals */ \ + 0,0,0,0, /* pots */ \ + 0, /* vbat */ \ + 0, /* rtc_bat */ \ + 0, /* SWA */ \ + 0 /* SWB */ \ + } + +#endif + + // Power #define PWR_SWITCH_GPIO GPIO_PIN(GPIOI, 11) // PI.11 #define PWR_ON_GPIO GPIO_PIN(GPIOI, 14) // PI.14 // Chargers (USB and wireless) #define UCHARGER_GPIO GPIO_PIN(GPIOB, 14) // PB.14 input - #define UCHARGER_CHARGE_END_GPIO GPIO_PIN(GPIOB, 13) // PB.13 input - -#define UCHARGER_EN_GPIO GPIO_PIN(GPIOG, 3) // PG.03 output +#if defined(RADIO_PL18) || defined(RADIO_PL18EV) + #define UCHARGER_EN_GPIO GPIO_PIN(GPIOG, 3) // PG.03 output +#endif #if defined (WIRELESS_CHARGER) #define WCHARGER_GPIO GPIO_PIN(GPIOI, 9) // PI.09 input @@ -416,7 +465,29 @@ //used in BOOTLOADER #define SERIAL_RCC_AHB1Periph 0 #define SERIAL_RCC_APB1Periph 0 + +#if defined(RADIO_NB4P) +// Rotary Encoder +#define ROTARY_ENCODER_RCC_APB1Periph RCC_APB1Periph_TIM12 +#define ROTARY_ENCODER_GPIO GPIOH +#define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_11 // PH.11 +#define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_10 // PH.10 +#define ROTARY_ENCODER_POSITION() ((ROTARY_ENCODER_GPIO->IDR >> 10) & 0x03) +#define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_11 +#define ROTARY_ENCODER_EXTI_LINE2 LL_EXTI_LINE_10 +#if !defined(USE_EXTI15_10_IRQ) + #define USE_EXTI15_10_IRQ + #define EXTI15_10_IRQ_Priority 5 +#endif +#define ROTARY_ENCODER_EXTI_PORT LL_SYSCFG_EXTI_PORTH +#define ROTARY_ENCODER_EXTI_SYS_LINE1 LL_SYSCFG_EXTI_LINE11 +#define ROTARY_ENCODER_EXTI_SYS_LINE2 LL_SYSCFG_EXTI_LINE10 +#define ROTARY_ENCODER_TIMER TIM12 +#define ROTARY_ENCODER_TIMER_IRQn TIM8_BRK_TIM12_IRQn +#define ROTARY_ENCODER_TIMER_IRQHandler TIM8_BRK_TIM12_IRQHandler +#else #define ROTARY_ENCODER_RCC_APB1Periph 0 +#endif // SPI NOR Flash #define FLASH_SPI SPI6 @@ -469,6 +540,15 @@ #endif // Haptic: TIM1_CH1 +#if defined(RADIO_NB4P) +#define HAPTIC_PWM +#define HAPTIC_GPIO GPIO_PIN(GPIOB, 0) // PB.00 +#define HAPTIC_GPIO_TIMER TIM1 +#define HAPTIC_GPIO_AF GPIO_AF1 +#define HAPTIC_TIMER_OUTPUT_ENABLE TIM_CCER_CC1E | TIM_CCER_CC1NE; +#define HAPTIC_TIMER_MODE TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE +#define HAPTIC_TIMER_COMPARE_VALUE HAPTIC_GPIO_TIMER->CCR1 +#else #define HAPTIC_PWM #define HAPTIC_GPIO GPIO_PIN(GPIOA, 8) // PA.08 #define HAPTIC_GPIO_TIMER TIM1 @@ -476,6 +556,7 @@ #define HAPTIC_TIMER_OUTPUT_ENABLE TIM_CCER_CC1E | TIM_CCER_CC1NE; #define HAPTIC_TIMER_MODE TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE #define HAPTIC_TIMER_COMPARE_VALUE HAPTIC_GPIO_TIMER->CCR1 +#endif // Flysky Hall Stick #define FLYSKY_HALL_SERIAL_USART UART4 diff --git a/radio/src/targets/pl18/key_driver.cpp b/radio/src/targets/pl18/key_driver.cpp index 89f399136..fefd7783d 100644 --- a/radio/src/targets/pl18/key_driver.cpp +++ b/radio/src/targets/pl18/key_driver.cpp @@ -28,6 +28,8 @@ #include "delays_driver.h" #include "keys.h" +#if !defined(RADIO_NB4P) + /* The output bit-order has to be: 0 LHL TR7L (Left equals down) 1 LHR TR7R @@ -218,3 +220,5 @@ uint32_t readTrims() return result; } + +#endif diff --git a/radio/src/targets/pl18/touch_driver.cpp b/radio/src/targets/pl18/touch_driver.cpp index 8e09f810b..c2ca11cdc 100644 --- a/radio/src/targets/pl18/touch_driver.cpp +++ b/radio/src/targets/pl18/touch_driver.cpp @@ -74,12 +74,20 @@ const char TOUCH_CONTROLLER_STR[][10] = {"", "FT6236", "CST340", "CHSC5448"}; TouchController touchController = TC_NONE; +enum TouchRotate +{ + DEG_0, + DEG_90, + DEG_180, + DEG_270 +}; + struct TouchControllerDescriptor { bool (*hasTouchEvent)(); bool (*touchRead)(uint16_t * X, uint16_t * Y); void (*printDebugInfo)(); - bool needTranspose; + TouchRotate rotate; }; union rpt_point_t @@ -131,7 +139,7 @@ static void _i2c_init(void) static void _i2c_reInit(void) { - stm32_i2c_deinit(TOUCH_I2C_BUS); +// stm32_i2c_deinit(TOUCH_I2C_BUS); _i2c_init(); } @@ -283,7 +291,11 @@ static const TouchControllerDescriptor FT6236 = .hasTouchEvent = ft6236HasTouchEvent, .touchRead = ft6236TouchRead, .printDebugInfo = ft6236PrintDebugInfo, - .needTranspose = true, +#if defined(RADIO_NB4P) + .rotate = DEG_180, +#else + .rotate = DEG_270, +#endif }; static const TouchControllerDescriptor CST340 = @@ -291,7 +303,11 @@ static const TouchControllerDescriptor CST340 = .hasTouchEvent = cst340HasTouchEvent, .touchRead = cst340TouchRead, .printDebugInfo = cst340PrintDebugInfo, - .needTranspose = true, +#if defined(RADIO_NB4P) + .rotate = DEG_180, +#else + .rotate = DEG_270, +#endif }; static const TouchControllerDescriptor CHSC5448 = @@ -299,7 +315,7 @@ static const TouchControllerDescriptor CHSC5448 = .hasTouchEvent = chsc5448HasTouchEvent, .touchRead = chsc5448TouchRead, .printDebugInfo = chsc5448PrintDebugInfo, - .needTranspose = false, + .rotate = DEG_0, }; void _detect_touch_controller() @@ -315,7 +331,11 @@ void _detect_touch_controller() } else { touchController = TC_FT6236; tcd = &FT6236; +#if defined(RADIO_NB4P) + TouchControllerType = 0; +#else TouchControllerType = 1; +#endif } } @@ -354,11 +374,19 @@ struct TouchState touchPanelRead() unsigned short touchY; bool hasTouchContact = tcd->touchRead(&touchX, &touchY); - if (tcd->needTranspose) { - // Touch sensor is rotated by 90 deg - unsigned short tmp = touchY; - touchY = 319 - touchX; - touchX = tmp; + unsigned short tmp; + switch(tcd->rotate) { + case DEG_270: + tmp = touchY; + touchY = 319 - touchX; + touchX = tmp; + break; + case DEG_180: + touchY = 479 - touchY; + touchX = 319 - touchX; + break; + default: + break; } if (hasTouchContact) { diff --git a/radio/util/hw_defs/legacy_names.py b/radio/util/hw_defs/legacy_names.py index 2d2bcc874..53a9384be 100644 --- a/radio/util/hw_defs/legacy_names.py +++ b/radio/util/hw_defs/legacy_names.py @@ -684,26 +684,16 @@ LEGACY_NAMES = [ "nb4p" }, "inputs": { - "LH": { - "yaml": "Rud", - "lua": "rud", - "description": "Rudder" + "ST": { + "yaml": "ST", + "lua": "ste", + "description": "Steering" }, - "LV": { - "yaml": "Ele", - "lua": "ele", - "description": "Elevator" - }, - "RV": { - "yaml": "Thr", + "TH": { + "yaml": "TH", "lua": "thr", "description": "Throttle" }, - "RH": { - "yaml": "Ail", - "lua": "ail", - "description": "Aileron" - }, "P1": { "yaml": "POT1", "lua": "s1", @@ -723,22 +713,15 @@ LEGACY_NAMES = [ "lua": "s3", "label": "S3", "short_label": "3", - "description": "Potentiometer 3" - }, - "SL1": { - "yaml": "LS", - "lua": "ls", - "label": "LS", - "short_label": "L", - "description": "Left slider" - }, - "SL2": { - "yaml": "RS", - "lua": "rs", - "label": "RS", - "short_label": "R", - "description": "Right slider" + "description": "Analog 3" }, + "P4": { + "yaml": "POT4", + "lua": "s4", + "label": "S4", + "short_label": "4", + "description": "Analog 4" + } } }, { diff --git a/radio/util/hw_defs/pot_config.py b/radio/util/hw_defs/pot_config.py index 59aa1d263..da25c5bf3 100644 --- a/radio/util/hw_defs/pot_config.py +++ b/radio/util/hw_defs/pot_config.py @@ -43,8 +43,7 @@ POT_CONFIG = { "P1": {"default": "POT"}, "P2": {"default": "POT"}, "P3": {"default": "POT"}, - "SL1": {"default": "SLIDER"}, - "SL2": {"default": "SLIDER"} + "P4": {"default": "POT"} }, "v12": { "P1": {"default": "POT_CENTER"}, diff --git a/radio/util/hw_defs/switch_config.py b/radio/util/hw_defs/switch_config.py index 5050d10b7..081f2946a 100644 --- a/radio/util/hw_defs/switch_config.py +++ b/radio/util/hw_defs/switch_config.py @@ -67,13 +67,7 @@ SWITCH_CONFIG = { }, "nb4p": { "SA": { "default": "2POS" }, - "SB": { "default": "3POS" }, - "SC": { "default": "2POS" }, - "SD": { "default": "3POS" }, - "SE": { "default": "3POS" }, - "SF": { "default": "2POS" }, - "SG": { "default": "3POS" }, - "SH": { "default": "TOGGLE" } + "SB": { "default": "2POS" } }, "lr3pro": { # left side