Files
edgetx-gx12/radio/src/targets/taranis/hal.h
T

1063 lines
50 KiB
C

/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#pragma once
#include "hal_settings.h"
#define TELEMETRY_EXTI_PRIO 0 // required for soft serial
// Keys
#if defined(RADIO_T8)
#define KEYS_GPIO_REG_BIND GPIOA
#define KEYS_GPIO_PIN_BIND LL_GPIO_PIN_10 // PA.10
#elif defined(RADIO_COMMANDO8)
#define KEYS_GPIO_REG_BIND GPIOD
#define KEYS_GPIO_PIN_BIND LL_GPIO_PIN_9 // PD.09
#endif
// Rotary Encoder
#if defined(PCBX9E)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOD
#define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_12 // PD.12
#define ROTARY_ENCODER_GPIO_PIN_B LL_GPIO_PIN_13 // PD.13
#define ROTARY_ENCODER_POSITION (ROTARY_ENCODER_GPIO->IDR >> 12) & 0x03
#define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_12
#define ROTARY_ENCODER_EXTI_LINE2 LL_EXTI_LINE_13
#define ROTARY_ENCODER_EXTI_PORT LL_SYSCFG_EXTI_PORTD
#define ROTARY_ENCODER_EXTI_SYS_LINE1 LL_SYSCFG_EXTI_LINE12
#define ROTARY_ENCODER_EXTI_SYS_LINE2 LL_SYSCFG_EXTI_LINE13
// ROTARY_ENCODER_EXTI IRQ
#if !defined(USE_EXTI15_10_IRQ)
#define USE_EXTI15_10_IRQ
#define EXTI15_10_IRQ_Priority 5
#endif
#elif defined(RADIO_X9DP2019)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_10 // PE.10
#define ROTARY_ENCODER_GPIO_PIN_B LL_GPIO_PIN_11 // PE.11
#define ROTARY_ENCODER_POSITION (((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x02) + ((ROTARY_ENCODER_GPIO->IDR >> 11) & 0x01))
#define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_10
#define ROTARY_ENCODER_EXTI_LINE2 LL_EXTI_LINE_11
#define ROTARY_ENCODER_EXTI_PORT LL_SYSCFG_EXTI_PORTE
#define ROTARY_ENCODER_EXTI_SYS_LINE1 LL_SYSCFG_EXTI_LINE10
#define ROTARY_ENCODER_EXTI_SYS_LINE2 LL_SYSCFG_EXTI_LINE11
// ROTARY_ENCODER_EXTI IRQ
#if !defined(USE_EXTI15_10_IRQ)
#define USE_EXTI15_10_IRQ
#define EXTI15_10_IRQ_Priority 5
#endif
#elif defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_FAMILY_T20) || defined(RADIO_BUMBLEBEE)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_9 // PE.09
#define ROTARY_ENCODER_GPIO_PIN_B LL_GPIO_PIN_11 // PE.11
#define ROTARY_ENCODER_POSITION (((ROTARY_ENCODER_GPIO->IDR >> 10) & 0x02) + ((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x01))
#define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_9
#define ROTARY_ENCODER_EXTI_LINE2 LL_EXTI_LINE_11
// ROTARY_ENCODER_EXTI_LINE1 IRQ
#if !defined(USE_EXTI9_5_IRQ)
#define USE_EXTI9_5_IRQ
#define EXTI9_5_IRQ_Priority 5
#endif
// ROTARY_ENCODER_EXTI_LINE2 IRQ
#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_PORTE
#define ROTARY_ENCODER_EXTI_SYS_LINE1 LL_SYSCFG_EXTI_LINE9
#define ROTARY_ENCODER_EXTI_SYS_LINE2 LL_SYSCFG_EXTI_LINE11
#elif defined(PCBX9LITE)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_10 // PE.10
#define ROTARY_ENCODER_GPIO_PIN_B LL_GPIO_PIN_12 // PE.12
#define ROTARY_ENCODER_POSITION (((ROTARY_ENCODER_GPIO->IDR >> 12) & 0x01) + ((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x02))
#define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_10
#define ROTARY_ENCODER_EXTI_LINE2 LL_EXTI_LINE_12
#define ROTARY_ENCODER_EXTI_PORT LL_SYSCFG_EXTI_PORTE
#define ROTARY_ENCODER_EXTI_SYS_LINE1 LL_SYSCFG_EXTI_LINE10
#define ROTARY_ENCODER_EXTI_SYS_LINE2 LL_SYSCFG_EXTI_LINE12
// ROTARY_ENCODER_EXTI IRQ
#if !defined(USE_EXTI15_10_IRQ)
#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_V14LCD) || defined(RADIO_GX12)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_9 // PE.9
#define ROTARY_ENCODER_GPIO_PIN_B LL_GPIO_PIN_10 // PE.10
#define ROTARY_ENCODER_POSITION ((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x03)
#define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_9
#define ROTARY_ENCODER_EXTI_LINE2 LL_EXTI_LINE_10
#define ROTARY_ENCODER_EXTI_PORT LL_SYSCFG_EXTI_PORTE
#define ROTARY_ENCODER_EXTI_SYS_LINE1 LL_SYSCFG_EXTI_LINE9
#define ROTARY_ENCODER_EXTI_SYS_LINE2 LL_SYSCFG_EXTI_LINE10
// ROTARY_ENCODER_EXTI_LINE1 IRQ
#if !defined(USE_EXTI9_5_IRQ)
#define USE_EXTI9_5_IRQ
#define EXTI9_5_IRQ_Priority 5
#endif
// ROTARY_ENCODER_EXTI_LINE2 IRQ
#if !defined(USE_EXTI15_10_IRQ)
#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_V14LCD)
#define ROTARY_ENCODER_INVERTED
#endif
#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
#define ROTARY_ENCODER_TIMER TIM5
#define ROTARY_ENCODER_TIMER_IRQn TIM5_IRQn
#define ROTARY_ENCODER_TIMER_IRQHandler TIM5_IRQHandler
#endif
// 6POS SW
#if defined(RADIO_V14) || defined(RADIO_V14LCD)
#define SIXPOS_SWITCH_INDEX 6
#define SIXPOS_LED_RED 200
#define SIXPOS_LED_GREEN 0
#define SIXPOS_LED_BLUE 0
#endif
#if defined(PCBX9E)
#define ADC_VREF_PREC2 300
#elif defined(PCBX9DP)
#if PCBREV < 2019
#define ADC_VREF_PREC2 330
#else
#define ADC_VREF_PREC2 300
#endif
#elif defined(PCBXLITE)
#define PWM_STICKS
#define PWM_TIMER TIM5
#define PWM_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define PWM_GPIO GPIOA
#define PWM_GPIO_AF GPIO_AF2
#define PWM_IRQHandler TIM5_IRQHandler
#define PWM_IRQn TIM5_IRQn
#define PWM_GPIOA_PINS (LL_GPIO_PIN_0 | LL_GPIO_PIN_1 | LL_GPIO_PIN_2 | LL_GPIO_PIN_3)
#define ADC_VREF_PREC2 330
#elif defined(RADIO_T8)
#define ADC_VREF_PREC2 300
#elif defined(RADIO_COMMANDO8)
#define ADC_VREF_PREC2 320
#define PWM_STICKS
#define PWM_TIMER TIM5
#define PWM_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define PWM_GPIO GPIOA
#define PWM_GPIO_AF GPIO_AF2
#define PWM_IRQn TIM5_IRQn
#define PWM_IRQHandler TIM5_IRQHandler
#include "hal_pwm_sticks.h"
#elif defined(RADIO_TLITE) || defined(RADIO_LR3PRO)
#define ADC_VREF_PREC2 330
#elif defined(RADIO_T14)
#define ADC_VREF_PREC2 300
#elif defined(RADIO_TPROS)
#define ADC_VREF_PREC2 300
#elif defined(RADIO_T12MAX)
#define ADC_VREF_PREC2 300
#elif defined(RADIO_TPRO) || defined(RADIO_TPROV2)
#define ADC_VREF_PREC2 300
#elif defined(RADIO_BUMBLEBEE)
#define ADC_VREF_PREC2 300
#elif defined(RADIO_FAMILY_T20)
#define ADC_VREF_PREC2 300
#elif defined(RADIO_MT12)
#define ADC_VREF_PREC2 330
#elif defined(RADIO_GX12)
#define ADC_VREF_PREC2 330
#elif defined(RADIO_V14) || defined(RADIO_V14LCD)
#define ADC_VREF_PREC2 330
#elif defined(PCBX7)
#define ADC_VREF_PREC2 330
#elif defined(PCBX9LITE)
#define ADC_VREF_PREC2 300
#else
#define ADC_VREF_PREC2 330
#endif
#if defined(RADIO_BOXER)
#define DEFAULT_6POS_CALIB {5, 13, 22, 31, 40}
#define DEFAULT_6POS_IDX 6
#endif
// PWR and LED driver
#if defined(PCBX9LITE)
#define PWR_SWITCH_GPIO GPIO_PIN(GPIOA, 7) // PA.07
#define PWR_ON_GPIO GPIO_PIN(GPIOA, 6) // PA.06
#elif defined(PCBXLITE)
#define PWR_SWITCH_GPIO GPIO_PIN(GPIOA, 7) // PA.07
#define PWR_ON_GPIO GPIO_PIN(GPIOE, 9) // PE.09
#elif defined(RADIO_COMMANDO8)
#define PWR_SWITCH_GPIO GPIO_PIN(GPIOD, 11) // PD.11
#define PWR_ON_GPIO GPIO_PIN(GPIOD, 10) // PD.10
#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_V14LCD)
#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
#endif
#if defined(FUNCTION_SWITCHES)
#if defined(RADIO_BUMBLEBEE)
#define GPIO_FSLED_GPIO_ON GPIO_SetBits
#define GPIO_FSLED_GPIO_OFF GPIO_ResetBits
#define FSLED_GPIO GPIOF
#define FSLED_GPIO_PIN_1 GPIO_PIN(FSLED_GPIO, 13)
#define FSLED_GPIO_PIN_2 GPIO_PIN(FSLED_GPIO, 6)
#define FSLED_GPIO_PIN_3 GPIO_PIN(FSLED_GPIO, 7)
#define FSLED_GPIO_PIN_4 GPIO_PIN(FSLED_GPIO, 10)
#define FSLED_GPIO_PIN_5 GPIO_PIN(FSLED_GPIO, 9)
#define FSLED_GPIO_PIN_6 GPIO_PIN(FSLED_GPIO, 8)
#elif defined(RADIO_FAMILY_T20)
#define GPIO_FSLED_GPIO_ON GPIO_SetBits
#define GPIO_FSLED_GPIO_OFF GPIO_ResetBits
#define FSLED_GPIO GPIOF
#define FSLED_GPIO_PIN_1 GPIO_PIN(FSLED_GPIO, 10)
#define FSLED_GPIO_PIN_2 GPIO_PIN(FSLED_GPIO, 9)
#define FSLED_GPIO_PIN_3 GPIO_PIN(FSLED_GPIO, 8)
#define FSLED_GPIO_PIN_4 GPIO_PIN(FSLED_GPIO, 7)
#define FSLED_GPIO_PIN_5 GPIO_PIN(FSLED_GPIO, 6)
#define FSLED_GPIO_PIN_6 GPIO_PIN(FSLED_GPIO, 13)
#else
#define GPIO_FSLED_GPIO_ON GPIO_SetBits
#define GPIO_FSLED_GPIO_OFF GPIO_ResetBits
#define FSLED_GPIO GPIOF
#define FSLED_GPIO_PIN_1 GPIO_PIN(FSLED_GPIO, 5)
#define FSLED_GPIO_PIN_2 GPIO_PIN(FSLED_GPIO, 4)
#define FSLED_GPIO_PIN_3 GPIO_PIN(FSLED_GPIO, 3)
#define FSLED_GPIO_PIN_4 GPIO_PIN(FSLED_GPIO, 2)
#define FSLED_GPIO_PIN_5 GPIO_PIN(FSLED_GPIO, 1)
#define FSLED_GPIO_PIN_6 GPIO_PIN(FSLED_GPIO, 0)
#endif
#endif
// Switches with LEDs
#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
#define SDLED_PWR_ON() gpio_set(SDLED_PWR_GPIO)
#endif
// Internal Module
#if defined(PCBXLITE)
#define EXTERNAL_ANTENNA
#endif
#if defined(PCBXLITE) || defined(PCBX9LITE)
#if defined(PCBXLITES) || defined(PCBX9LITE)
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOA, 15) // PA.15
#else
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 9) // PD.09
#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
#define INTMODULE_USART_IRQn USART1_IRQn
#define INTMODULE_DMA DMA2
#define INTMODULE_DMA_STREAM LL_DMA_STREAM_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
#if defined(PCBXLITES)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOC, 8) // PC.08
#define INTMODULE_BOOTCMD_DEFAULT 1 // SET
#endif
#elif defined(RADIO_X9DP2019)
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOA, 7) // PA.07
#define INTMODULE_TX_GPIO GPIO_PIN(GPIOB, 6) // PB.06
#define INTMODULE_RX_GPIO GPIO_PIN(GPIOB, 7) // PB.07
#define INTMODULE_USART USART1
#define INTMODULE_USART_IRQn USART1_IRQn
#define INTMODULE_DMA DMA2
#define INTMODULE_DMA_STREAM LL_DMA_STREAM_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_X7ACCESS)
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOC, 5) // PC.05
#define INTMODULE_TX_GPIO GPIO_PIN(GPIOB, 6) // PB.06
#define INTMODULE_RX_GPIO GPIO_PIN(GPIOB, 7) // PB.07
#define INTMODULE_USART USART1
#define INTMODULE_USART_IRQHandler USART1_IRQHandler
#define INTMODULE_USART_IRQn USART1_IRQn
#define INTMODULE_DMA DMA2
#define INTMODULE_DMA_STREAM LL_DMA_STREAM_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_V14LCD) || 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
#else
#if defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_TPROS)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOE, 14) // PE.14
#else
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOB, 1) // PB.01
#endif
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOC, 4) // PC.04
#endif
#if defined(RADIO_V14) || defined(RADIO_V14LCD)
#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
#define INTMODULE_USART_IRQHandler USART1_IRQHandler
#define INTMODULE_USART_IRQn USART1_IRQn
#define INTMODULE_DMA DMA2
#define INTMODULE_DMA_STREAM LL_DMA_STREAM_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
#define INTMODULE_RX_DMA DMA2
#define INTMODULE_RX_DMA_STREAM LL_DMA_STREAM_2
#define INTMODULE_RX_DMA_CHANNEL LL_DMA_CHANNEL_4
#elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7)
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOC, 6) // PC.06
#define INTMODULE_TX_GPIO GPIO_PIN(GPIOA, 10) // PA.10
#define INTMODULE_TX_GPIO_AF LL_GPIO_AF_1
#define INTMODULE_TIMER TIM1
#define INTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH3
#define INTMODULE_TIMER_IRQn TIM1_UP_TIM10_IRQn
#define INTMODULE_TIMER_IRQHandler TIM1_UP_TIM10_IRQHandler
#define INTMODULE_TIMER_DMA DMA2
#define INTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_6
#define INTMODULE_TIMER_DMA_STREAM LL_DMA_STREAM_5
#define INTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream5_IRQn
#define INTMODULE_TIMER_DMA_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#elif (defined(RADIO_FAMILY_JUMPER_T12) && defined(HARDWARE_INTERNAL_MODULE)) || defined(RADIO_TX12) || defined(RADIO_T8) || defined(RADIO_TPRO) || defined(RADIO_TPROV2)|| defined(RADIO_T20)
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOC, 6) // PC.06
#define INTMODULE_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10
#define INTMODULE_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#define INTMODULE_USART USART3
#define INTMODULE_USART_IRQn USART3_IRQn
// DMA1_Stream3 is already used by SDIO
// #define INTMODULE_DMA NULL
// #define INTMODULE_DMA_CHANNEL 0
// #define INTMODULE_DMA_STREAM 0
#define INTMODULE_RX_DMA DMA1
#define INTMODULE_RX_DMA_STREAM LL_DMA_STREAM_1
#define INTMODULE_RX_DMA_CHANNEL LL_DMA_CHANNEL_4
#if defined(RADIO_TLITE)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOA, 5) // PA.05
#define INTMODULE_BOOTCMD_DEFAULT 0 // RESET
#elif defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_TPROS)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOF, 11) // PF.11
#define INTMODULE_BOOTCMD_DEFAULT 0 // RESET
#elif defined(RADIO_FAMILY_T20) || defined(RADIO_BUMBLEBEE)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOE, 4) // PE.04
#define INTMODULE_BOOTCMD_DEFAULT 0 // RESET
#elif defined(RADIO_LR3PRO)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOB, 5) // PB.05
#define INTMODULE_BOOTCMD_DEFAULT 0 // RESET
#endif
#elif defined(RADIO_COMMANDO8)
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOE, 8) // PE.08
#define INTMODULE_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10
#define INTMODULE_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#define INTMODULE_USART USART3
#define INTMODULE_USART_IRQn USART3_IRQn
// // DMA1_Stream3 is already used by SDIO
// #define INTMODULE_DMA NULL
// #define INTMODULE_DMA_CHANNEL 0
// #define INTMODULE_DMA_STREAM 0
#else
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 15) // PD.15
#define INTMODULE_TX_GPIO GPIO_PIN(GPIOA, 10) // PA.10
#define INTMODULE_TX_GPIO_AF LL_GPIO_AF_1
#define INTMODULE_TIMER TIM1
#define INTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH3
#define INTMODULE_TIMER_IRQn TIM1_UP_TIM10_IRQn
#define INTMODULE_TIMER_IRQHandler TIM1_UP_TIM10_IRQHandler
#define INTMODULE_TIMER_DMA DMA2
#define INTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_6
#define INTMODULE_TIMER_DMA_STREAM LL_DMA_STREAM_5
#define INTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream5_IRQn
#define INTMODULE_TIMER_DMA_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#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_V14LCD) || 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)
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 8) // PD.08
#elif defined(PCBX9LITE)
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOA, 8) // PA.08
#elif defined(RADIO_GX12)
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOE, 0) // PE.00
#else
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 11) // PD.11
#endif
#define EXTERNAL_MODULE_PWR_ON() gpio_set(EXTMODULE_PWR_GPIO)
#define EXTERNAL_MODULE_PWR_OFF() gpio_clear(EXTMODULE_PWR_GPIO)
#define IS_EXTERNAL_MODULE_ON() gpio_read(EXTMODULE_PWR_GPIO)
#define EXTMODULE_TX_GPIO GPIO_PIN(GPIOC, 6) // PC.06
#define EXTMODULE_RX_GPIO GPIO_PIN(GPIOC, 7) // PC.07
#define EXTMODULE_TIMER TIM8
#define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH1
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define EXTMODULE_TIMER_IRQn TIM8_UP_TIM13_IRQn
#define EXTMODULE_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler
#define EXTMODULE_TIMER_TX_GPIO_AF LL_GPIO_AF_3 // TIM8_CH1
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_7
#define EXTMODULE_TIMER_DMA DMA2
#define EXTMODULE_TIMER_DMA_STREAM LL_DMA_STREAM_1
#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn
#define EXTMODULE_TIMER_DMA_IRQHandler DMA2_Stream1_IRQHandler
#define EXTMODULE_USART USART6
#define EXTMODULE_USART_IRQn USART6_IRQn
#define EXTMODULE_USART_IRQHandler USART6_IRQHandler
#define EXTMODULE_USART_TX_DMA DMA2
#define EXTMODULE_USART_TX_DMA_CHANNEL LL_DMA_CHANNEL_5
#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_V14LCD)
#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
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOE, 2) // External tuner power: PE.02
#define EXTERNAL_MODULE_PWR_ON() \
do { \
gpio_set(EXTMODULE_PWR_GPIO); \
gpio_set(EXTMODULE_RF_SWITCH_GPIO); \
} while (0)
#define EXTERNAL_MODULE_PWR_OFF() \
do { \
gpio_clear(EXTMODULE_PWR_GPIO); \
gpio_clear(EXTMODULE_RF_SWITCH_GPIO); \
} while (0)
#elif defined(RADIO_FAMILY_T20) || defined(RADIO_BUMBLEBEE)
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOB, 1) // PB.01
#define EXTERNAL_MODULE_PWR_ON() gpio_set(EXTMODULE_PWR_GPIO)
#define EXTERNAL_MODULE_PWR_OFF() gpio_clear(EXTMODULE_PWR_GPIO)
#else
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 8) // PD.08
#define EXTERNAL_MODULE_PWR_ON() gpio_set(EXTMODULE_PWR_GPIO)
#define EXTERNAL_MODULE_PWR_OFF() gpio_clear(EXTMODULE_PWR_GPIO)
#endif
#define IS_EXTERNAL_MODULE_ON() gpio_read(EXTMODULE_PWR_GPIO)
#define EXTMODULE_TX_GPIO GPIO_PIN(GPIOA, 7) // PA.07
#define EXTMODULE_TIMER TIM8
#define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH1N
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF3 // TIM8_CH1N
#define EXTMODULE_TIMER_IRQn TIM8_UP_TIM13_IRQn
#define EXTMODULE_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler
#define EXTMODULE_TIMER_DMA DMA2
#define EXTMODULE_TIMER_DMA_STREAM LL_DMA_STREAM_1
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_7
#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn
#define EXTMODULE_TIMER_DMA_IRQHandler DMA2_Stream1_IRQHandler
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#endif
// Trainer Port
#if defined(PCBXLITES) || defined(PCBX9LITE)
// on these 2 radios the trainer port already uses DMA1_Stream6, we won't use the DMA
#define TRAINER_IN_GPIO GPIO_PIN(GPIOD, 13) // PD.13
#define TRAINER_IN_TIMER_Channel LL_TIM_CHANNEL_CH2
#define TRAINER_OUT_GPIO GPIO_PIN(GPIOD, 12) // PD.12
#define TRAINER_OUT_TIMER_Channel LL_TIM_CHANNEL_CH1
#if defined(PCBX9LITE)
#define TRAINER_DETECT_GPIO GPIO_PIN(GPIOD, 11) // PD.11
#endif
#define TRAINER_TIMER TIM4
#define TRAINER_GPIO_AF GPIO_AF2 // TIM4_CH1 (Out) + TIM4_CH2 (In)
#define TRAINER_TIMER_IRQn TIM4_IRQn
#define TRAINER_TIMER_IRQHandler TIM4_IRQHandler
#define TRAINER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#elif defined(PCBXLITE)
#define TRAINER_TIMER TIM4
#define TRAINER_TIMER_IRQn TIM4_IRQn
#define TRAINER_TIMER_IRQHandler TIM4_IRQHandler
#else
#define TRAINER_IN_GPIO GPIO_PIN(GPIOC, 8) // PC.08
#define TRAINER_IN_TIMER_Channel LL_TIM_CHANNEL_CH3
#define TRAINER_OUT_GPIO GPIO_PIN(GPIOC, 9) // PC.09
#define TRAINER_OUT_TIMER_Channel LL_TIM_CHANNEL_CH4
#if defined(RADIO_FAMILY_T20) || defined(RADIO_BUMBLEBEE)
#define TRAINER_DETECT_GPIO GPIO_PIN(GPIOE, 3) // PE.03
#elif defined(RADIO_MT12)
#define TRAINER_DETECT_GPIO GPIO_PIN(GPIOD, 14) // PD.14
#else
#define TRAINER_DETECT_GPIO GPIO_PIN(GPIOA, 8) // PA.08
#endif
#if !defined(RADIO_X9DP2019) && !defined(RADIO_X7ACCESS)
#define TRAINER_DETECT_INVERTED
#endif
#define TRAINER_TIMER TIM3
#define TRAINER_TIMER_IRQn TIM3_IRQn
#define TRAINER_GPIO_AF LL_GPIO_AF_2
#define TRAINER_TIMER_IRQn TIM3_IRQn
#define TRAINER_TIMER_IRQHandler TIM3_IRQHandler
#define TRAINER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#endif
// Serial Port
#if (defined(PCBX7) && !defined(AUX_SERIAL)) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019)
#elif defined(RADIO_GX12)
#define HARDWARE_TRAINER_AUX_SERIAL
#define AUX_SERIAL_GPIO GPIOD
#define AUX_SERIAL_TX_GPIO GPIO_PIN(GPIOD, 8) // PD.08
#define AUX_SERIAL_RX_GPIO GPIO_PIN(GPIOD, 9) // PD.09
#define AUX_SERIAL_USART USART3
#define AUX_SERIAL_USART_IRQn USART3_IRQn
#define AUX_SERIAL_DMA_RX DMA1
#define AUX_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_1
#define AUX_SERIAL_DMA_RX_CHANNEL LL_DMA_CHANNEL_4
#else
#define HARDWARE_TRAINER_AUX_SERIAL
#define AUX_SERIAL_GPIO GPIOB
#define AUX_SERIAL_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10
#define AUX_SERIAL_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#define AUX_SERIAL_USART USART3
#define AUX_SERIAL_USART_IRQn USART3_IRQn
#define AUX_SERIAL_DMA_RX DMA1
#define AUX_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_1
#define AUX_SERIAL_DMA_RX_CHANNEL LL_DMA_CHANNEL_4
#endif
// Telemetry
#define TELEMETRY_DIR_GPIO GPIO_PIN(GPIOD, 4) // PD.04
#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || \
defined(RADIO_X7ACCESS)
#define TELEMETRY_SET_INPUT 1
#else
#define TELEMETRY_SET_INPUT 0
#endif
#if defined(RADIO_V14) || defined(RADIO_V14LCD)
#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
#define TELEMETRY_DMA DMA1
#define TELEMETRY_DMA_Stream_TX LL_DMA_STREAM_6
#define TELEMETRY_DMA_Channel_TX LL_DMA_CHANNEL_4
#define TELEMETRY_DMA_TX_Stream_IRQ DMA1_Stream6_IRQn
#define TELEMETRY_DMA_TX_IRQHandler DMA1_Stream6_IRQHandler
#define TELEMETRY_DMA_TX_FLAG_TC DMA_IT_TCIF6
#define TELEMETRY_USART_IRQHandler USART2_IRQHandler
#define TELEMETRY_USART_IRQn USART2_IRQn
#define TELEMETRY_EXTI_PORT LL_SYSCFG_EXTI_PORTD
#define TELEMETRY_EXTI_SYS_LINE LL_SYSCFG_EXTI_LINE6
#define TELEMETRY_EXTI_LINE LL_EXTI_LINE_6
#define TELEMETRY_EXTI_TRIGGER LL_EXTI_TRIGGER_RISING
// TELEMETRY_EXTI IRQ
#if !defined(USE_EXTI9_5_IRQ)
#define USE_EXTI9_5_IRQ
#endif
// overwrite priority
#undef EXTI9_5_IRQ_Priority
#define EXTI9_5_IRQ_Priority TELEMETRY_EXTI_PRIO
#define TELEMETRY_TIMER TIM11
#define TELEMETRY_TIMER_IRQn TIM1_TRG_COM_TIM11_IRQn
#define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler
// Software IRQ (Prio 5 -> FreeRTOS compatible)
#define TELEMETRY_RX_FRAME_EXTI_LINE LL_EXTI_LINE_4
#define USE_EXTI4_IRQ
#define EXTI4_IRQ_Priority 5
// PCBREV
#if defined(RADIO_X7) && !defined(DEBUG_SEGGER_RTT)
#define PCBREV_GPIO GPIO_PIN(GPIOA, 14) // PA.14
#define PCBREV_GPIO_PULL_DOWN
#define PCBREV_VALUE() (gpio_read(PCBREV_GPIO) >> 14)
#endif
// USB Charger
#if defined(USB_CHARGER)
#define USB_CHARGER_GPIO GPIO_PIN(GPIOB, 5)
#endif
// S.Port update connector
#if defined(PCBXLITE)
#define SPORT_MAX_BAUDRATE 250000 // not tested
#define SPORT_UPDATE_PWR_GPIO GPIO_PIN(GPIOD, 8) // PD.08
#elif defined(PCBX7ACCESS)
#define SPORT_MAX_BAUDRATE 400000
#define SPORT_UPDATE_PWR_GPIO GPIO_PIN(GPIOB, 3) // PB.03
#elif defined(RADIO_X7)
#define SPORT_MAX_BAUDRATE 250000 // < 400000
#define SPORT_UPDATE_PWR_GPIO GPIO_PIN(GPIOB, 2) // PB.02
#elif defined(PCBX9LITE)
#define SPORT_MAX_BAUDRATE 250000 // not tested
#define SPORT_UPDATE_PWR_GPIO GPIO_PIN(GPIOE, 15) // PE.15
#elif defined(RADIO_X9DP2019)
#define SPORT_MAX_BAUDRATE 400000
#define SPORT_UPDATE_PWR_GPIO GPIO_PIN(GPIOA, 14) // PA.14
#else
#define SPORT_MAX_BAUDRATE 400000
#endif
// Heartbeat for iXJT / ISRM synchro
#define INTMODULE_HEARTBEAT_TRIGGER GPIO_FALLING
#if !defined(HARDWARE_EXTERNAL_MODULE)
// No heartbeat
#elif defined(PCBXLITE)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_GPIO GPIO_PIN(GPIOD, 15) // PD.15
#define INTMODULE_HEARTBEAT_EXTI_PORT LL_SYSCFG_EXTI_PORTD
#define INTMODULE_HEARTBEAT_EXTI_SYS_LINE LL_SYSCFG_EXTI_LINE15
#define INTMODULE_HEARTBEAT_EXTI_LINE LL_EXTI_LINE_15
// INTMODULE_HEARTBEAT_EXTI IRQ
#if !defined(USE_EXTI15_10_IRQ)
#define USE_EXTI15_10_IRQ
#define EXTI15_10_IRQ_Priority 5
#endif
#elif defined(PCBX9LITE)
// No heartbeat
#elif defined(RADIO_X7ACCESS)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_GPIO GPIO_PIN(GPIOA, 7) // PA.07
#define INTMODULE_HEARTBEAT_EXTI_PORT LL_SYSCFG_EXTI_PORTA
#define INTMODULE_HEARTBEAT_EXTI_SYS_LINE LL_SYSCFG_EXTI_LINE7
#define INTMODULE_HEARTBEAT_EXTI_LINE LL_EXTI_LINE_7
// INTMODULE_HEARTBEAT_EXTI IRQ
#if !defined(USE_EXTI9_5_IRQ)
#define USE_EXTI9_5_IRQ
#define EXTI9_5_IRQ_Priority 5
#endif
#elif defined(RADIO_X9DP2019)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_GPIO GPIO_PIN(GPIOB, 1) // PB.01
#define INTMODULE_HEARTBEAT_EXTI_PORT LL_SYSCFG_EXTI_PORTB
#define INTMODULE_HEARTBEAT_EXTI_SYS_LINE LL_SYSCFG_EXTI_LINE1
#define INTMODULE_HEARTBEAT_EXTI_LINE LL_EXTI_LINE_1
// INTMODULE_HEARTBEAT_EXTI IRQ
#if !defined(USE_EXTI1_IRQ)
#define USE_EXTI1_IRQ
#define EXTI1_IRQ_Priority 5
#endif
#elif defined(MANUFACTURER_FRSKY)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_GPIO GPIO_PIN(GPIOC, 7) // PC.07
#define INTMODULE_HEARTBEAT_EXTI_PORT LL_SYSCFG_EXTI_PORTC
#define INTMODULE_HEARTBEAT_EXTI_SYS_LINE LL_SYSCFG_EXTI_LINE7
#define INTMODULE_HEARTBEAT_EXTI_LINE LL_EXTI_LINE_7
// INTMODULE_HEARTBEAT_EXTI IRQ
#if !defined(USE_EXTI9_5_IRQ)
#define USE_EXTI9_5_IRQ
#define EXTI9_5_IRQ_Priority 5
#endif
#endif
// 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_T14) || defined(RADIO_T12MAX) || defined(RADIO_V14) || defined(RADIO_V14LCD) \
|| defined(RADIO_GX12)
#define TRAINER_MODULE_CPPM_TIMER TIM3
#define TRAINER_MODULE_CPPM_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define TRAINER_MODULE_CPPM_GPIO EXTMODULE_RX_GPIO
#define TRAINER_MODULE_CPPM_TIMER_Channel LL_TIM_CHANNEL_CH2
#define TRAINER_MODULE_CPPM_TIMER_IRQn TIM3_IRQn
#define TRAINER_MODULE_CPPM_GPIO_AF LL_GPIO_AF_2
#if defined(PCBX9LITE) || defined(PCBXLITE)
#define TRAINER_MODULE_CPPM_TIMER_IRQHandler TIM3_IRQHandler
#endif
#elif defined(INTMODULE_HEARTBEAT_GPIO) && defined(HARDWARE_EXTERNAL_MODULE)
// Trainer CPPM input on heartbeat pin
#define TRAINER_MODULE_CPPM_TIMER TRAINER_TIMER
#define TRAINER_MODULE_CPPM_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define TRAINER_MODULE_CPPM_GPIO INTMODULE_HEARTBEAT_GPIO
#define TRAINER_MODULE_CPPM_TIMER_Channel LL_TIM_CHANNEL_CH2
#define TRAINER_MODULE_CPPM_TIMER_IRQn TRAINER_TIMER_IRQn
#define TRAINER_MODULE_CPPM_GPIO_AF GPIO_AF2
// Trainer SBUS input on heartbeat pin
#define TRAINER_MODULE_SBUS_USART USART6
#define TRAINER_MODULE_SBUS_USART_IRQn USART6_IRQn
#define TRAINER_MODULE_SBUS_GPIO INTMODULE_HEARTBEAT_GPIO
#define TRAINER_MODULE_SBUS_DMA DMA2
#define TRAINER_MODULE_SBUS_DMA_STREAM DMA2_Stream1
#define TRAINER_MODULE_SBUS_DMA_STREAM_LL LL_DMA_STREAM_1
#define TRAINER_MODULE_SBUS_DMA_CHANNEL LL_DMA_CHANNEL_5
#else
// TODO: replace SBUS trainer with S.PORT pin
#endif
// USB
#define USB_GPIO_VBUS GPIO_PIN(GPIOA, 9) // PA.09
#define USB_GPIO_DM GPIO_PIN(GPIOA, 11) // PA.11
#define USB_GPIO_DP GPIO_PIN(GPIOA, 12) // PA.12
#define USB_GPIO_AF GPIO_AF10
// BackLight
#if defined(PCBX9E)
#define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define BACKLIGHT_TIMER TIM9
#define BACKLIGHT_GPIO_1 GPIO_PIN(GPIOE, 6) // PE.06
#define BACKLIGHT_GPIO_2 GPIO_PIN(GPIOE, 5) // PE.05
#define BACKLIGHT_GPIO_AF GPIO_AF3
#elif defined(PCBX9DP)
#define BACKLIGHT_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define BACKLIGHT_TIMER TIM4
#define BACKLIGHT_GPIO_1 GPIO_PIN(GPIOD, 15) // PD.15
#define BACKLIGHT_GPIO_2 GPIO_PIN(GPIOD, 13) // PD.13
#define BACKLIGHT_GPIO_AF GPIO_AF2
#elif defined(PCBXLITES) || defined(PCBX9LITE)
#define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define BACKLIGHT_TIMER TIM1
#define BACKLIGHT_GPIO GPIO_PIN(GPIOA, 10) // PA.10
#define BACKLIGHT_GPIO_AF GPIO_AF1
#define BACKLIGHT_CCMR2 TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 // Channel 3, PWM
#define BACKLIGHT_CCER TIM_CCER_CC3E
#define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR3
#elif defined(PCBXLITE)
#define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define BACKLIGHT_TIMER TIM1
#define BACKLIGHT_GPIO GPIO_PIN(GPIOA, 8) // PA.08
#define BACKLIGHT_GPIO_AF GPIO_AF1
#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_TPROS) || defined(RADIO_FAMILY_T20) || defined(RADIO_T14) || defined(RADIO_BUMBLEBEE) || defined(RADIO_GX12) || defined(RADIO_V14)
// No backlight: OLED display
#elif defined(RADIO_COMMANDO8)
#define BACKLIGHT_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define BACKLIGHT_TIMER TIM4
#define BACKLIGHT_GPIO GPIO_PIN(GPIOD, 13) // PD.13
#define BACKLIGHT_GPIO_AF GPIO_AF2
#define BACKLIGHT_CCMR1 TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 // Channel2, PWM
#define BACKLIGHT_CCER TIM_CCER_CC2E
#define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR2
#elif defined(PCBX7)
#define BACKLIGHT_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define BACKLIGHT_TIMER TIM4
#define BACKLIGHT_GPIO GPIO_PIN(GPIOD, 13) // PD.13
#define BACKLIGHT_GPIO_AF GPIO_AF2
#define BACKLIGHT_CCMR1 TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 // Channel2, PWM
#define BACKLIGHT_CCER TIM_CCER_CC2E
#define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR2
#else
#define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define BACKLIGHT_TIMER TIM10
#define BACKLIGHT_GPIO GPIO_PIN(GPIOB, 8) // PB.08
#define BACKLIGHT_GPIO_AF GPIO_AF3
#endif
// LCD driver
#if defined(RADIO_T14) || defined(RADIO_GX12) || defined(RADIO_V14)
#define SSD1309_LCD
#endif
#if defined(PCBX9E)
#define LCD_MOSI_GPIO GPIO_PIN(GPIOC, 12) // PC.12
#define LCD_CLK_GPIO GPIO_PIN(GPIOC, 10) // PC.10
#define LCD_A0_GPIO GPIO_PIN(GPIOC, 11) // PC.11
#define LCD_NCS_GPIO GPIO_PIN(GPIOA, 15) // PA.15
#define LCD_RST_GPIO GPIO_PIN(GPIOD, 15) // PD.15
#define LCD_DMA DMA1
#define LCD_DMA_Stream DMA1_Stream7
#define LCD_DMA_Stream_IRQn DMA1_Stream7_IRQn
#define LCD_DMA_Stream_IRQHandler DMA1_Stream7_IRQHandler
#define LCD_DMA_FLAGS (DMA_HIFCR_CTCIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTEIF7 | DMA_HIFCR_CDMEIF7 | DMA_HIFCR_CFEIF7)
#define LCD_DMA_FLAG_INT DMA_HIFCR_CTCIF7
#define LCD_SPI SPI3
#define LCD_GPIO_AF GPIO_AF6
#elif defined(PCBXLITE) || defined(PCBX9LITE)
#define LCD_MOSI_GPIO GPIO_PIN(GPIOC, 12) // PC.12
#define LCD_CLK_GPIO GPIO_PIN(GPIOC, 10) // PC.10
#define LCD_A0_GPIO GPIO_PIN(GPIOC, 11) // PC.11
#define LCD_NCS_GPIO GPIO_PIN(GPIOD, 3) // PD.03
#define LCD_RST_GPIO GPIO_PIN(GPIOD, 2) // PD.02
#define LCD_DMA DMA1
#define LCD_DMA_Stream DMA1_Stream7
#define LCD_DMA_Stream_IRQn DMA1_Stream7_IRQn
#define LCD_DMA_Stream_IRQHandler DMA1_Stream7_IRQHandler
#define LCD_DMA_FLAGS (DMA_HIFCR_CTCIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTEIF7 | DMA_HIFCR_CDMEIF7 | DMA_HIFCR_CFEIF7)
#define LCD_DMA_FLAG_INT DMA_HIFCR_CTCIF7
#define LCD_SPI SPI3
#define LCD_GPIO_AF GPIO_AF6
#elif defined(PCBX9DP) || defined(PCBX7)
#define LCD_MOSI_GPIO GPIO_PIN(GPIOC, 12) // PC.12
#define LCD_CLK_GPIO GPIO_PIN(GPIOC, 10) // PC.10
#define LCD_A0_GPIO GPIO_PIN(GPIOC, 11) // PC.11
#define LCD_NCS_GPIO GPIO_PIN(GPIOA, 15) // PA.15
#if defined(RADIO_FAMILY_T20) || defined(RADIO_BUMBLEBEE)
#define LCD_RST_GPIO GPIO_PIN(GPIOA, 14) // PA.14
#else
#define LCD_RST_GPIO GPIO_PIN(GPIOD, 12) // PD.12
#endif
#define LCD_DMA DMA1
#define LCD_DMA_Stream DMA1_Stream7
#define LCD_DMA_Stream_IRQn DMA1_Stream7_IRQn
#define LCD_DMA_Stream_IRQHandler DMA1_Stream7_IRQHandler
#define LCD_DMA_FLAGS (DMA_HIFCR_CTCIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTEIF7 | DMA_HIFCR_CDMEIF7 | DMA_HIFCR_CFEIF7)
#define LCD_DMA_FLAG_INT DMA_HIFCR_CTCIF7
#define LCD_SPI SPI3
#define LCD_GPIO_AF GPIO_AF6
#else
// Soft SPI: these pins are not connected to SPI periph on STM32F205
#define LCD_MOSI_GPIO GPIO_PIN(GPIOD, 10) // PD.10
#define LCD_CLK_GPIO GPIO_PIN(GPIOD, 11) // PD.11
#define LCD_A0_GPIO GPIO_PIN(GPIOD, 13) // PD.13
#define LCD_NCS_GPIO GPIO_PIN(GPIOD, 14) // PD.14
#define LCD_RST_GPIO GPIO_PIN(GPIOD, 12) // PD.12
#endif
#if defined(SSD1309_LCD)
#define LCD_SPI_PRESCALER SPI_CR1_BR_1
#else
#define LCD_SPI_PRESCALER 0
#endif
#if defined(RADIO_GX12)
#define OLED_VCC_CS GPIO_PIN(GPIOD, 11) // PD.11
#endif
// I2C Bus 1: EEPROM and CAT5137 digital pot for volume control
#define I2C_B1 I2C1
#define I2C_B1_GPIO_AF LL_GPIO_AF_4
#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(PCBX7ACCESS) || \
defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_X9DP2019) || \
defined(RADIO_GX12) || 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
#define I2C_B1_SCL_GPIO GPIO_PIN(GPIOB, 6) // PB.06
#define I2C_B1_SDA_GPIO GPIO_PIN(GPIOB, 7) // PB.07
#endif
// EEPROM
#if defined(PCBXLITE) || defined(PCBX9LITE)
#define EEPROM_WP_GPIO GPIOD
#define EEPROM_WP_GPIO_PIN LL_GPIO_PIN_7 // PD.07
#elif defined(PCBX7ACCESS)
#define EEPROM_WP_GPIO GPIOB
#define EEPROM_WP_GPIO_PIN LL_GPIO_PIN_5 // PB.05
#elif defined(RADIO_ZORRO) || defined(RADIO_POCKET) || defined(RADIO_TX12MK2)|| \
defined(RADIO_BOXER) || defined(RADIO_GX12)
#define EEPROM_WP_GPIO GPIOD
#define EEPROM_WP_GPIO_PIN LL_GPIO_PIN_10 // PD.10
#elif defined(RADIO_X9DP2019)
#define EEPROM_WP_GPIO GPIOF
#define EEPROM_WP_GPIO_PIN LL_GPIO_PIN_0 // PF.00
#else
#define EEPROM_WP_GPIO GPIOB
#define EEPROM_WP_GPIO_PIN LL_GPIO_PIN_9 // PB.09
#endif
// I2C Volume control
#if !defined(SOFTWARE_VOLUME)
#define VOLUME_I2C_ADDRESS 0x2E
#define VOLUME_I2C_BUS I2C_Bus_1
#include <stdint.h>
int32_t getVolume();
#endif
#define I2C_B1_CLK_RATE 400000
// EEPROM
#define EEPROM_I2C_ADDRESS 0x51
#define EEPROM_I2C_BUS I2C_Bus_1
#define EEPROM_PAGESIZE 64
#define EEPROM_SIZE (32*1024)
// Second I2C Bus: IMU
#if defined(PCBXLITES)
#define I2C_B2 I2C3
#define I2C_B2_SCL_GPIO GPIO_PIN(GPIOA, 8) // PA.08
#define I2C_B2_SDA_GPIO GPIO_PIN(GPIOC, 9) // PC.09
#define I2C_B2_GPIO_AF LL_GPIO_AF_4
#define I2C_B2_CLK_RATE 400000
#define IMU_I2C_BUS I2C_Bus_2
#define IMU_I2C_ADDRESS 0x6B
#endif
#if defined(RADIO_GX12)
#define I2C_B2 I2C2
#define I2C_B2_SCL_GPIO GPIO_PIN(GPIOB, 10) // PB.10
#define I2C_B2_SDA_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#define I2C_B2_GPIO_AF LL_GPIO_AF_4
#define I2C_B2_CLK_RATE 400000
#define USE_EXTI1_IRQ
#define EXTI1_IRQ_Priority 5
#endif
// SD - SPI2
#if defined(RADIO_FAMILY_T20) || defined(RADIO_T14) || defined(RADIO_T12MAX) || defined(RADIO_TPROS) || defined(RADIO_BUMBLEBEE) || defined(RADIO_GX12)
// Using chip, so no detect
#else
#if defined(PCBXLITE) || defined(PCBX9LITE)
#define SD_PRESENT_GPIO GPIO_PIN(GPIOD, 10) // PD.10
#elif defined(RADIO_COMMANDO8)
#define SD_PRESENT_GPIO GPIO_PIN(GPIOD, 8) // PD.08
#else
#define SD_PRESENT_GPIO GPIO_PIN(GPIOD, 9) // PD.09
#endif
#endif
#define STORAGE_USE_SDCARD_SPI
#if defined(RADIO_GX12)
#define SD_LONG_BUSY_WAIT (true)
#endif
#define SD_GPIO_PIN_CS GPIO_PIN(GPIOB, 12) // PB.12
#define SD_GPIO_PIN_SCK GPIO_PIN(GPIOB, 13) // PB.13
#define SD_GPIO_PIN_MISO GPIO_PIN(GPIOB, 14) // PB.14
#define SD_GPIO_PIN_MOSI GPIO_PIN(GPIOB, 15) // PB.15
#define SD_SPI SPI2
#define SD_SPI_DMA DMA1
#define SD_SPI_DMA_RX_STREAM LL_DMA_STREAM_3
#define SD_SPI_DMA_TX_STREAM LL_DMA_STREAM_4
#define SD_SPI_DMA_CHANNEL LL_DMA_CHANNEL_0
// Audio
#define AUDIO_OUTPUT_GPIO GPIO_PIN(GPIOA, 4)
#define AUDIO_DMA DMA1
#define AUDIO_DMA_Stream DMA1_Stream5
#define AUDIO_DMA_Stream_IRQn DMA1_Stream5_IRQn
#define AUDIO_DMA_Stream_IRQHandler DMA1_Stream5_IRQHandler
#define AUDIO_TIMER TIM6
#if defined(PCBXLITES)
#define JACK_DETECT_GPIO GPIO_PIN(GPIOC, 13) // PC.13
#define AUDIO_SPEAKER_ENABLE_GPIO GPIO_PIN(GPIOD, 14) // PD.14
#define HEADPHONE_TRAINER_SWITCH_GPIO GPIO_PIN(GPIOD, 9) // PD.09
#elif defined(RADIO_FAMILY_T20) || defined(RADIO_BUMBLEBEE)
#define AUDIO_MUTE_GPIO GPIO_PIN(GPIOG, 4) // PG.04
#define AUDIO_MUTE_DELAY 500 // ms
#define AUDIO_UNMUTE_DELAY 150 // ms
#elif defined(RADIO_COMMANDO8)
#define AUDIO_MUTE_GPIO GPIO_PIN(GPIOB, 1)
#define AUDIO_MUTE_DELAY 500 // ms
#define INVERTED_MUTE_PIN
#elif defined(MANUFACTURER_RADIOMASTER) || defined(MANUFACTURER_JUMPER) || defined(RADIO_LR3PRO)
#define AUDIO_MUTE_GPIO GPIO_PIN(GPIOE, 12)
#define AUDIO_MUTE_DELAY 500 // ms
#if defined(MANUFACTURER_JUMPER) || defined(RADIO_LR3PRO)
#define AUDIO_UNMUTE_DELAY 250 // ms
#else
#define AUDIO_UNMUTE_DELAY 150 // ms
#endif
#endif
#if defined(RADIO_MT12)
#define SERVO_PWM
#define PWM_GPIO GPIO_PIN(GPIOB, 0) // PB.00
#define PWM_GPIO_AF GPIO_AF2
#define PWM_GPIO_TIMER TIM3 // Timer 3 Channel3
#define PWM_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define PWM_COUNTER_REGISTER PWM_TIMER->CCR3
#define PWM_CCMR2 TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2
#define PWM_CCER TIM_CCER_CC3E
#endif
#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
#define FLYSKY_HALL_DMA_Channel LL_DMA_CHANNEL_4
#define FLYSKY_HALL_SERIAL_TX_GPIO GPIO_PIN(GPIOA, 0) // PA.00
#define FLYSKY_HALL_SERIAL_RX_GPIO GPIO_PIN(GPIOA, 1) // PA.01
#define FLYSKY_HALL_SERIAL_USART_IRQn UART4_IRQn
#define FLYSKY_HALL_SERIAL_DMA DMA1
#define FLYSKY_HALL_DMA_Stream_RX LL_DMA_STREAM_2
#define FLYSKY_HALL_DMA_Stream_TX LL_DMA_STREAM_4
#endif
#if defined(RADIO_GX12)
#define HALL_SYNC GPIO_PIN(GPIOE, 7) // PE.07
#endif
// Top LCD on X9E
#if defined(PCBX9E)
#define TOPLCD_GPIO
#define TOPLCD_GPIO_DATA GPIO_PIN(GPIOG, 5) // PG.05
#define TOPLCD_GPIO_WR GPIO_PIN(GPIOG, 4) // PG.04
#define TOPLCD_GPIO_CS1 GPIO_PIN(GPIOG, 3) // PG.03
#define TOPLCD_GPIO_CS2 GPIO_PIN(GPIOG, 15) // PG.15
#define TOPLCD_GPIO_BL GPIO_PIN(GPIOG, 2) // PG.02
#endif
// Bluetooth
#if defined(PCBX9E)
#define STORAGE_BLUETOOTH
#define BT_USART USART6
#define BT_USART_IRQn USART6_IRQn
#define BT_TX_GPIO GPIO_PIN(GPIOG, 14) // PG.14
#define BT_RX_GPIO GPIO_PIN(GPIOG, 9) // PG.09
#define BT_EN_GPIO GPIO_PIN(GPIOG, 11) // PD.11
// #define BT_BRTS_GPIO GPIOE
// #define BT_BRTS_GPIO_PIN LL_GPIO_PIN_12 // PE.12
// #define BT_BCTS_GPIO GPIOG
// #define BT_BCTS_GPIO_PIN LL_GPIO_PIN_6 // PG.06
#elif defined(BLUETOOTH)
#define STORAGE_BLUETOOTH
#if defined(PCBX9DP)
#define BT_EN_GPIO GPIO_PIN(GPIOB, 2) // PB.02
#elif defined(PCBXLITE)
#define BT_EN_GPIO GPIO_PIN(GPIOE, 15) // PE.15
#elif defined(PCBX9LITES)
#define BT_EN_GPIO GPIO_PIN(GPIOD, 14) // PD.14
#elif defined(MANUFACTURER_RADIOMASTER)
#if defined(RADIO_POCKET) || defined(RADIO_GX12)
#define BT_EN_GPIO GPIO_PIN(GPIOA, 6) // PA.06
#endif
#else
#define BT_EN_GPIO GPIO_PIN(GPIOE, 12) // PE.12
#endif
#if defined(RADIO_GX12)
#define BT_TX_GPIO GPIO_PIN(GPIOD, 8) // PD.08
#define BT_RX_GPIO GPIO_PIN(GPIOD, 9) // PD.09
#else
#define BT_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10
#define BT_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#endif
#define BT_USART USART3
#define BT_USART_IRQn USART3_IRQn
// #define BT_DMA_Stream_RX DMA1_Stream1
// #define BT_DMA_Channel_RX DMA_Channel_4
#else
#if defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_TX12) || defined(RADIO_TX12MK2)|| defined(RADIO_BOXER) || defined(RADIO_GX12) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) || defined(RADIO_ZORRO)
// To avoid change in modelsize, todo: remove me
#define STORAGE_BLUETOOTH
#endif
#endif