From 1f44053705714e274a775c651176b35a9fa1fb9f Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 1 Sep 2023 08:27:48 +0200 Subject: [PATCH] fix: PXX1 external module timings (#3941) --- radio/src/boards/generic_stm32/module_ports.cpp | 4 ++++ .../targets/common/arm/stm32/stm32_softserial_driver.cpp | 6 ++++-- .../src/targets/common/arm/stm32/stm32_softserial_driver.h | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/radio/src/boards/generic_stm32/module_ports.cpp b/radio/src/boards/generic_stm32/module_ports.cpp index f36b80833..5b918fc7a 100644 --- a/radio/src/boards/generic_stm32/module_ports.cpp +++ b/radio/src/boards/generic_stm32/module_ports.cpp @@ -520,6 +520,10 @@ const etx_module_t _sport_module = { #endif // SPORT_UPDATE_PWR_GPIO +#if !defined(RADIO_X10E) +uint32_t __pxx1_get_inverter_comp() { return 1; } +#endif + void boardInitModulePorts() { _sport_direction_init(); diff --git a/radio/src/targets/common/arm/stm32/stm32_softserial_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_softserial_driver.cpp index 77fc8f4cb..5a58fdc90 100644 --- a/radio/src/targets/common/arm/stm32/stm32_softserial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_softserial_driver.cpp @@ -313,6 +313,8 @@ static void _conv_byte_8n1(stm32_softserial_tx_state* st, uint8_t b) #define PXX1_BIT_ZERO 16 /* 0 = 16us */ #define PXX1_BIT_ONE 24 /* 1 = 24us */ +__attribute__ ((weak)) uint32_t __pxx1_get_inverter_comp() { return 0; } + static void _conv_byte_pxx1(stm32_softserial_tx_state* st, uint8_t b) { uint32_t bits = st->serial_size < 8 ? st->serial_size : 8; @@ -360,7 +362,7 @@ static void* stm32_softserial_tx_init(void* hw_def, const etx_serial_init* param freq = PXX1_FREQ; polarity = false; ocmode = LL_TIM_OCMODE_FORCED_INACTIVE; - cmp_val = PXX1_PWM_ON; + cmp_val = PXX1_PWM_ON + __pxx1_get_inverter_comp(); break; default: @@ -483,7 +485,7 @@ static void stm32_softserial_tx_send_buffer(void* ctx, const uint8_t* data, uint // dirty hack... if (st->conv_byte == _conv_byte_pxx1) { ocmode = LL_TIM_OCMODE_PWM1; - cmp_val = PXX1_PWM_ON; + cmp_val = PXX1_PWM_ON + __pxx1_get_inverter_comp(); } stm32_pulse_start_dma_req(timer, pulses, length, ocmode, cmp_val); diff --git a/radio/src/targets/common/arm/stm32/stm32_softserial_driver.h b/radio/src/targets/common/arm/stm32/stm32_softserial_driver.h index 4d0a46882..97e5d0482 100644 --- a/radio/src/targets/common/arm/stm32/stm32_softserial_driver.h +++ b/radio/src/targets/common/arm/stm32/stm32_softserial_driver.h @@ -105,3 +105,7 @@ struct stm32_softserial_tx_port { #define REF_STM32_SOFTSERIAL_PORT(p) ((void*)& p ## _STM32Softserial) extern const etx_serial_driver_t STM32SoftSerialTxDriver; + +// This is defined as a weak symbol to allow stretching the prelude part +// of PXX1 pulses to an acceptable length +uint32_t __pxx1_get_inverter_comp();