From 244efed6ba49fe0cb9c09be111290c80cbb41abb Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 21 Mar 2022 07:43:27 +0100 Subject: [PATCH] NV14 touch driver --- .../common/arm/stm32/extmodule_driver.cpp | 1 + .../common/arm/stm32/lsm6ds_driver.cpp | 13 +- .../common/arm/stm32/stm32_i2c_driver.cpp | 1 + .../targets/common/arm/stm32/timers_driver.h | 2 +- radio/src/targets/horus/board.h | 5 - radio/src/targets/horus/hal.h | 22 +- radio/src/targets/nv14/board.h | 6 - radio/src/targets/nv14/hal.h | 46 ++- radio/src/targets/nv14/touch_driver.cpp | 278 +++++++----------- radio/src/targets/taranis/board.h | 11 - radio/src/targets/taranis/hal.h | 17 +- 11 files changed, 180 insertions(+), 222 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/extmodule_driver.cpp b/radio/src/targets/common/arm/stm32/extmodule_driver.cpp index 0e28537a4..001fb1cd8 100644 --- a/radio/src/targets/common/arm/stm32/extmodule_driver.cpp +++ b/radio/src/targets/common/arm/stm32/extmodule_driver.cpp @@ -23,6 +23,7 @@ #include "stm32_pulse_driver.h" #include "hal.h" +#include "board.h" #include "timers_driver.h" static const stm32_pulse_timer_t extmoduleTimer = { diff --git a/radio/src/targets/common/arm/stm32/lsm6ds_driver.cpp b/radio/src/targets/common/arm/stm32/lsm6ds_driver.cpp index 61f876d4e..e753e7a84 100644 --- a/radio/src/targets/common/arm/stm32/lsm6ds_driver.cpp +++ b/radio/src/targets/common/arm/stm32/lsm6ds_driver.cpp @@ -19,10 +19,14 @@ * GNU General Public License for more details. */ +#include +#include "gyro.h" + +#if defined(IMU_I2C_BUS) && defined(IMU_I2C_ADDRESS) + #include "stm32_i2c_driver.h" #include "delays_driver.h" #include "hal.h" -#include "gyro.h" #include @@ -266,3 +270,10 @@ int gyroRead(uint8_t buffer[IMU_BUFFER_LENGTH]) { return I2C_LSM6DS_ReadRegister(LSM6DS_GYRO_OUT_X_L_ADDR, buffer, IMU_BUFFER_LENGTH); } + +#else + +int gyroInit() { return -1; } +int gyroRead(uint8_t buffer[IMU_BUFFER_LENGTH]) { return -1; } + +#endif diff --git a/radio/src/targets/common/arm/stm32/stm32_i2c_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_i2c_driver.cpp index 2a69aed44..8e137fefd 100644 --- a/radio/src/targets/common/arm/stm32/stm32_i2c_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_i2c_driver.cpp @@ -24,6 +24,7 @@ #include "stm32_i2c_driver.h" #include "hal.h" +#include "timers_driver.h" #include "debug.h" struct _i2c_defs { diff --git a/radio/src/targets/common/arm/stm32/timers_driver.h b/radio/src/targets/common/arm/stm32/timers_driver.h index 638dff109..5ba92aebc 100644 --- a/radio/src/targets/common/arm/stm32/timers_driver.h +++ b/radio/src/targets/common/arm/stm32/timers_driver.h @@ -28,7 +28,7 @@ uint16_t getTmr2MHz(); #define watchdogSuspend(timeout) #else -#include "board.h" +#include "hal.h" void init2MhzTimer(); void init1msTimer(); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 494da0cbe..8b7c75c96 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -62,11 +62,6 @@ extern HardwareOptions hardwareOptions; #define LUA_MEM_EXTRA_MAX (2 MB) // max allowed memory usage for Lua bitmaps (in bytes) #define LUA_MEM_MAX (6 MB) // max allowed memory usage for complete Lua (in bytes), 0 means unlimited -// HSI is at 168Mhz (over-drive is not enabled!) -#define PERI1_FREQUENCY 42000000 -#define PERI2_FREQUENCY 84000000 -#define TIMER_MULT_APB1 2 -#define TIMER_MULT_APB2 2 extern uint16_t sessionTimer; diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index d351973b4..d18391765 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -23,6 +23,10 @@ #define _HAL_H_ #define CPU_FREQ 168000000 +#define PERI1_FREQUENCY 42000000 +#define PERI2_FREQUENCY 84000000 +#define TIMER_MULT_APB1 2 +#define TIMER_MULT_APB2 2 // Keys #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOJ) @@ -847,12 +851,8 @@ #define EXTMODULE_RCC_APB2Periph 0 #define EXTMODULE_TX_GPIO GPIOB #define EXTMODULE_USART_GPIO EXTMODULE_TX_GPIO - #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_10 // PB.10 (TIM2_CH3) - #define EXTMODULE_TX_GPIO_PIN_LL LL_GPIO_PIN_10 // PB.10 (TIM2_CH3) - #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource10 - #define EXTMODULE_RX_GPIO_PIN GPIO_Pin_11 // PB.11 - #define EXTMODULE_RX_GPIO_PIN_LL LL_GPIO_PIN_11 // PB.11 - #define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource11 + #define EXTMODULE_TX_GPIO_PIN LL_GPIO_PIN_10 // PB.10 (TIM2_CH3) + #define EXTMODULE_RX_GPIO_PIN LL_GPIO_PIN_11 // PB.11 #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM2 #define EXTMODULE_TIMER TIM2 #define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH3 @@ -861,7 +861,7 @@ #define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) #define EXTMODULE_TIMER_IRQn TIM2_IRQn #define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler - #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_3 + #define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_3 #define EXTMODULE_TIMER_DMA_STREAM DMA1_Stream1 #define EXTMODULE_TIMER_DMA DMA1 #define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_1 @@ -874,11 +874,11 @@ #define EXTMODULE_USART_IRQn USART3_IRQn #define EXTMODULE_USART_IRQHandler USART3_IRQHandler #define EXTMODULE_USART_TX_DMA DMA1 - #define EXTMODULE_USART_TX_DMA_CHANNEL DMA_Channel_4 + #define EXTMODULE_USART_TX_DMA_CHANNEL LL_DMA_CHANNEL_4 #define EXTMODULE_USART_TX_DMA_STREAM DMA1_Stream3 #define EXTMODULE_USART_TX_DMA_STREAM_LL LL_DMA_STREAM_3 #define EXTMODULE_USART_TX_DMA_FLAG_TC DMA_FLAG_TCIF3 - #define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_4 + #define EXTMODULE_USART_RX_DMA_CHANNEL LL_DMA_CHANNEL_4 #define EXTMODULE_USART_RX_DMA_STREAM DMA1_Stream1 #elif defined(PCBX10) || PCBREV >= 13 #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) @@ -894,7 +894,7 @@ #define EXTMODULE_TIMER_IRQn TIM1_UP_TIM10_IRQn #define EXTMODULE_TIMER_IRQHandler TIM1_UP_TIM10_IRQHandler #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) - #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_6 + #define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_6 #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream5 #define EXTMODULE_TIMER_DMA DMA2 #define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_5 @@ -916,7 +916,7 @@ #define EXTMODULE_TIMER_IRQn TIM2_IRQn #define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler #define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) - #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_3 + #define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_3 #define EXTMODULE_TIMER_DMA_STREAM DMA1_Stream7 #define EXTMODULE_TIMER_DMA DMA1 #define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_7 diff --git a/radio/src/targets/nv14/board.h b/radio/src/targets/nv14/board.h index b6306859e..877cd2536 100644 --- a/radio/src/targets/nv14/board.h +++ b/radio/src/targets/nv14/board.h @@ -48,12 +48,6 @@ #define LUA_MEM_EXTRA_MAX (2 MB) // max allowed memory usage for Lua bitmaps (in bytes) #define LUA_MEM_MAX (6 MB) // max allowed memory usage for complete Lua (in bytes), 0 means unlimited -// HSI is at 168Mhz (over-drive is not enabled!) -#define PERI1_FREQUENCY 42000000 -#define PERI2_FREQUENCY 84000000 -#define TIMER_MULT_APB1 2 -#define TIMER_MULT_APB2 2 - extern uint16_t sessionTimer; #define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) diff --git a/radio/src/targets/nv14/hal.h b/radio/src/targets/nv14/hal.h index 61a5e71d3..f19c81500 100644 --- a/radio/src/targets/nv14/hal.h +++ b/radio/src/targets/nv14/hal.h @@ -24,6 +24,12 @@ #define CPU_FREQ 168000000 +// HSI is at 168Mhz (over-drive is not enabled!) +#define PERI1_FREQUENCY 42000000 +#define PERI2_FREQUENCY 84000000 +#define TIMER_MULT_APB1 2 +#define TIMER_MULT_APB2 2 + /* Timers Allocation: * TIM1 = Haptic * TIM4 = Trainer @@ -334,8 +340,26 @@ #define AUDIO_SPI_MOSI_GPIO_PinSource GPIO_PinSource5 // I2C Bus -#define I2C_B1_RCC_AHB1Periph 0 -#define I2C_B1_RCC_APB1Periph 0 +#define I2C_B1 I2C1 +#define I2C_B1_GPIO GPIOB +#define I2C_B1_SCL_GPIO_PIN LL_GPIO_PIN_8 // PB.08 +#define I2C_B1_SDA_GPIO_PIN LL_GPIO_PIN_7 // PB.09 +#define I2C_B1_GPIO_AF GPIO_AF4_I2C1 + +#define TOUCH_I2C_BUS I2C_Bus_1 +#define TOUCH_I2C_CLK_RATE 400000 + +#define TOUCH_INT_GPIO GPIOB +#define TOUCH_INT_GPIO_PIN LL_GPIO_PIN_9 // PB.09 + +#define TOUCH_RST_GPIO GPIOB +#define TOUCH_RST_GPIO_PIN LL_GPIO_PIN_12 // PB.12 + +#define TOUCH_INT_EXTI_Line LL_EXTI_LINE_9 +#define TOUCH_INT_EXTI_Port LL_SYSCFG_EXTI_PORTB +#define TOUCH_INT_EXTI_SysCfgLine LL_SYSCFG_EXTI_LINE9 +#define TOUCH_INT_EXTI_IRQn EXTI9_5_IRQn +#define TOUCH_INT_EXTI_IRQHandler EXTI9_5_IRQHandler // Haptic: TIM1_CH1 #define HAPTIC_PWM @@ -427,36 +451,32 @@ #define EXTMODULE_RCC_APB1Periph 0 #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) #define EXTMODULE_TX_GPIO GPIOC -#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PC.06 -#define EXTMODULE_TX_GPIO_PIN_LL LL_GPIO_PIN_6 -#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource6 -#define EXTMODULE_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1 +#define EXTMODULE_TX_GPIO_PIN LL_GPIO_PIN_6 // PC.06 +#define EXTMODULE_TX_GPIO_AF LL_GPIO_AF_3 // TIM8_CH1 #define EXTMODULE_TX_GPIO_AF_USART GPIO_AF_USART6 #define EXTMODULE_RX_GPIO GPIOC -#define EXTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PC.07 -#define EXTMODULE_RX_GPIO_PIN_LL LL_GPIO_PIN_7 -#define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource7 +#define EXTMODULE_RX_GPIO_PIN LL_GPIO_PIN_7 // PC.07 #define EXTMODULE_RX_GPIO_AF_USART GPIO_AF_USART6 #define EXTMODULE_TIMER TIM8 #define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH1 #define EXTMODULE_TIMER_IRQn TIM8_UP_TIM13_IRQn #define EXTMODULE_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) -#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 +#define EXTMODULE_TIMER_TX_GPIO_AF LL_GPIO_AF_3 //USART #define EXTMODULE_USART USART6 #define EXTMODULE_USART_GPIO GPIOC #define EXTMODULE_USART_GPIO_AF GPIO_AF_USART6 #define EXTMODULE_USART_GPIO_AF_LL LL_GPIO_AF_8 #define EXTMODULE_USART_TX_DMA DMA2 -#define EXTMODULE_USART_TX_DMA_CHANNEL DMA_Channel_5 +#define EXTMODULE_USART_TX_DMA_CHANNEL LL_DMA_CHANNEL_5 #define EXTMODULE_USART_TX_DMA_STREAM DMA2_Stream7 #define EXTMODULE_USART_TX_DMA_STREAM_LL LL_DMA_STREAM_7 #define EXTMODULE_USART_TX_DMA_IRQn DMA2_Stream7_IRQn #define EXTMODULE_USART_TX_DMA_IRQHandler DMA2_Stream7_IRQHandler #define EXTMODULE_USART_TX_DMA_FLAG_TC DMA_IT_TCIF7 -#define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_5 +#define EXTMODULE_USART_RX_DMA_CHANNEL LL_DMA_CHANNEL_5 #define EXTMODULE_USART_RX_DMA_STREAM DMA2_Stream2 #define EXTMODULE_USART_RX_DMA_IRQn DMA2_Stream2_IRQn #define EXTMODULE_USART_RX_DMA_IRQHandler DMA2_Stream2_IRQHandler @@ -467,7 +487,7 @@ #define EXTMODULE_TIMER_DMA_SIZE (DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0) //TIMER -#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 +#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_7 #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 #define EXTMODULE_TIMER_DMA DMA2 #define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_1 diff --git a/radio/src/targets/nv14/touch_driver.cpp b/radio/src/targets/nv14/touch_driver.cpp index d5b989dd6..e0af9a4ff 100644 --- a/radio/src/targets/nv14/touch_driver.cpp +++ b/radio/src/targets/nv14/touch_driver.cpp @@ -19,26 +19,28 @@ * GNU General Public License for more details. */ -#include "opentx.h" +#include "stm32_hal_ll.h" +#include "stm32_hal.h" +#include "hal.h" + +#include "stm32_i2c_driver.h" +#include "timers_driver.h" +#include "delays_driver.h" #include "touch_driver.h" +#include "debug.h" + volatile static bool touchEventOccured; #define FT6x06_MAX_INSTANCE 1 -#define I2C_TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB -#define I2C_TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1 -#define I2C_TOUCH I2C1 -#define I2C_TOUCH_GPIO GPIOB -#define I2C_TOUCH_SCL_GPIO_PIN GPIO_Pin_8 // PB.08 -#define I2C_TOUCH_SDA_GPIO_PIN GPIO_Pin_7 // PB.09 +#define TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB +#define TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1 +#define TOUCH_GPIO I2C_B1_GPIO +#define TOUCH_SCL_GPIO_PIN I2C_B1_SCL_GPIO_PIN // PB.08 +#define TOUCH_SDA_GPIO_PIN I2C_B1_SDA_GPIO_PIN // PB.09 -#define I2C_TOUCH_RESET_GPIO GPIOB -#define I2C_TOUCH_RESET_GPIO_PIN GPIO_Pin_12 // PB.12 -#define I2C_TOUCH_INT_GPIO GPIOB -#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_9 // PB.09 - -#define TOUCH_FT6236_I2C_ADDRESS (0x70>>1) +#define TOUCH_FT6236_I2C_ADDRESS (0x70>>1) uint8_t ft6x06[FT6x06_MAX_INSTANCE] = {0}; static ft6x06_handle_TypeDef ft6x06_handle = {FT6206_I2C_NOT_INITIALIZED, 0, 0}; @@ -52,209 +54,142 @@ static TouchState internalTouchState = {}; void I2C_FreeBus() { - GPIO_InitTypeDef GPIO_InitStructure; - // reset i2c bus by setting clk as output and sending manual clock pulses - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SCL_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); + LL_GPIO_InitTypeDef gpioInit; + LL_GPIO_StructInit(&gpioInit); - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SDA_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); + // reset i2c bus by setting clk as output and sending manual clock pulses + gpioInit.Pin = TOUCH_SCL_GPIO_PIN; + gpioInit.Mode = LL_GPIO_MODE_OUTPUT; + gpioInit.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + gpioInit.Pull = LL_GPIO_PULL_NO; + gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW; + LL_GPIO_Init(TOUCH_GPIO, &gpioInit); + + gpioInit.Pin = TOUCH_SDA_GPIO_PIN; + gpioInit.Mode = LL_GPIO_MODE_INPUT; + gpioInit.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; + gpioInit.Pull = LL_GPIO_PULL_UP; + gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW; + LL_GPIO_Init(TOUCH_GPIO, &gpioInit); //send 100khz clock train for some 100ms tmr10ms_t until = get_tmr10ms() + 11; while (get_tmr10ms() < until) { - if (GPIO_ReadInputDataBit(I2C_TOUCH_GPIO, I2C_TOUCH_SDA_GPIO_PIN) == 1) { + if (LL_GPIO_IsInputPinSet(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN)) { TRACE("touch: i2c free again\n"); break; } TRACE("FREEEEE"); - I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; //BSRRL + LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN); delay_us(10); - I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SCL_GPIO_PIN; + LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN); delay_us(10); } //send stop condition: - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SDA_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); + gpioInit.Pin = TOUCH_SDA_GPIO_PIN; + gpioInit.Mode = LL_GPIO_MODE_OUTPUT; + gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW; + LL_GPIO_Init(TOUCH_GPIO, &gpioInit); //clock is low - I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; + LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN); delay_us(10); //sda = lo - I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SDA_GPIO_PIN; + LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN); delay_us(10); //clock goes high - I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; + LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN); delay_us(10); //sda = hi - I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SDA_GPIO_PIN; + LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN); delay_us(10); TRACE("FREE BUS"); } -void Touch_DeInit() +// void Touch_DeInit() +// { +// I2C_DeInit(I2C_B1); +// __HAL_RCC_I2C1_FORCE_RESET(); +// delay_ms(150); +// __HAL_RCC_I2C1_RELEASE_RESET(); +// } + +static int _enable_gpio_clock(GPIO_TypeDef *GPIOx) { - I2C_DeInit(I2C_TOUCH); - (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)); - delay_ms(150); - (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)); + if (GPIOx == GPIOB) + __HAL_RCC_GPIOB_CLK_ENABLE(); + else + return -1; + + return 0; } void I2C_Init() { - Touch_DeInit(); + stm32_i2c_deinit(TOUCH_I2C_BUS); - GPIO_InitTypeDef GPIO_InitStructure; - EXTI_InitTypeDef EXTI_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - I2C_InitTypeDef I2C_InitStructure; + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_SYSCFG_CLK_ENABLE(); - - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); - - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); + __HAL_RCC_I2C1_CLK_ENABLE(); + __HAL_RCC_I2C1_CLK_DISABLE(); I2C_FreeBus(); - GPIO_PinAFConfig(I2C_TOUCH_GPIO, GPIO_PinSource7, GPIO_AF_I2C1); - GPIO_PinAFConfig(I2C_TOUCH_GPIO, GPIO_PinSource8, GPIO_AF_I2C1); + stm32_i2c_init(TOUCH_I2C_BUS, TOUCH_I2C_CLK_RATE); + + LL_GPIO_InitTypeDef gpioInit; + LL_GPIO_StructInit(&gpioInit); - GPIO_StructInit(&GPIO_InitStructure); - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SCL_GPIO_PIN | I2C_TOUCH_SDA_GPIO_PIN; - GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); + _enable_gpio_clock(TOUCH_RST_GPIO); + _enable_gpio_clock(TOUCH_INT_GPIO); - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_RESET_GPIO_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL; // - GPIO_Init(I2C_TOUCH_RESET_GPIO, &GPIO_InitStructure); - - - //https://community.st.com/s/question/0D50X00009XkZ9FSAV/stm32f4-i2c-issues-solved - RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); - I2C_StructInit(&I2C_InitStructure); - I2C_InitStructure.I2C_ClockSpeed = 400000; - I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; - I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; - I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; - I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; - I2C_Init(I2C_TOUCH, &I2C_InitStructure); - - I2C_Init(I2C_TOUCH, &I2C_InitStructure); - //I2C_StretchClockCmd(I2C_TOUCH, ENABLE); - I2C_Cmd(I2C_TOUCH, ENABLE); + gpioInit.Pin = TOUCH_RST_GPIO_PIN; + gpioInit.Mode = LL_GPIO_MODE_OUTPUT; + gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW; + gpioInit.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + gpioInit.Pull = LL_GPIO_PULL_UP; + LL_GPIO_Init(TOUCH_RST_GPIO, &gpioInit); //ext interupt - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_INT_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(I2C_TOUCH_INT_GPIO, &GPIO_InitStructure); + gpioInit.Pin = TOUCH_INT_GPIO_PIN; + gpioInit.Mode = LL_GPIO_MODE_INPUT; + gpioInit.Pull = LL_GPIO_PULL_UP; + gpioInit.Speed = LL_GPIO_SPEED_FREQ_HIGH; + gpioInit.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; + LL_GPIO_Init(TOUCH_INT_GPIO, &gpioInit); - SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource9); - EXTI_InitStructure.EXTI_Line = EXTI_Line9; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); + LL_SYSCFG_SetEXTISource(TOUCH_INT_EXTI_Port, TOUCH_INT_EXTI_SysCfgLine); - NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); + LL_EXTI_InitTypeDef extiInit; + LL_EXTI_StructInit(&extiInit); + + extiInit.Line_0_31 = TOUCH_INT_EXTI_Line; + extiInit.Mode = LL_EXTI_MODE_IT; + extiInit.Trigger = LL_EXTI_TRIGGER_FALLING; + extiInit.LineCommand = ENABLE; + LL_EXTI_Init(&extiInit); + + NVIC_SetPriority(TOUCH_INT_EXTI_IRQn, 8); + NVIC_EnableIRQ(TOUCH_INT_EXTI_IRQn); } -#define I2C_TIMEOUT_MAX 1000 - -bool I2C_WaitEvent(uint32_t event) -{ - uint32_t timeout = I2C_TIMEOUT_MAX; - while (!I2C_CheckEvent(I2C_TOUCH, event)) { - if ((timeout--) == 0) return false; - } - return true; -} - -bool I2C_WaitEventCleared(uint32_t event) -{ - uint32_t timeout = I2C_TIMEOUT_MAX; - while (I2C_CheckEvent(I2C_TOUCH, event)) { - if ((timeout--) == 0) return false; - } - return true; -} - -bool I2C_Send7BitAddress(uint8_t address, uint16_t direction) -{ - I2C_SendData(I2C_TOUCH, (address << 1) | ((direction == I2C_Direction_Receiver) ? 1 : 0)); - // check if slave acknowledged his address within timeout - if (!I2C_WaitEvent(direction == I2C_Direction_Transmitter ? I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) - return false; - return true; -} +#define I2C_TIMEOUT_MAX 5 // 5 ms bool touch_i2c_read(uint8_t addr, uint8_t reg, uint8_t * data, uint8_t len) { - if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) return false; - I2C_GenerateSTART(I2C_TOUCH, ENABLE); - if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false; - if (!I2C_Send7BitAddress(addr, I2C_Direction_Transmitter)) return false; - I2C_SendData(I2C_TOUCH, reg); - if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) return false; - I2C_GenerateSTART(I2C_TOUCH, ENABLE); - if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false; - if (!I2C_Send7BitAddress(addr, I2C_Direction_Receiver)) return false; + if (stm32_i2c_read(TOUCH_I2C_BUS, addr, reg, 2, data, len, I2C_TIMEOUT_MAX) < 0) + return false; - if (len > 1) I2C_AcknowledgeConfig(I2C_TOUCH, ENABLE); - - while (len) { - if (len == 1) I2C_AcknowledgeConfig(I2C_TOUCH, DISABLE); - if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_RECEIVED))return false; - *data++ = I2C_ReceiveData(I2C_TOUCH);; - len--; - } - I2C_GenerateSTOP(I2C_TOUCH, ENABLE); return true; } static bool touch_i2c_write(uint8_t addr, uint8_t reg, uint8_t * data, uint8_t len) { - if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) return false; - I2C_GenerateSTART(I2C_TOUCH, ENABLE); - if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false; + if (stm32_i2c_write(TOUCH_I2C_BUS, addr, reg, 2, data, len, I2C_TIMEOUT_MAX) < 0) + return false; - if (!I2C_Send7BitAddress(addr, I2C_Direction_Transmitter)) return false; - I2C_SendData(I2C_TOUCH, (uint8_t) ((reg & 0xFF00) >> 8)); - if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) return false; - I2C_SendData(I2C_TOUCH, (uint8_t) (reg & 0x00FF)); - if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) return false; - while (len--) { - I2C_SendData(I2C_TOUCH, *data); - if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) return false; - data++; - } - if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) return false; - I2C_GenerateSTOP(I2C_TOUCH, ENABLE); return true; } @@ -289,10 +224,12 @@ static uint16_t TS_IO_ReadMultiple(uint8_t addr, uint8_t reg, uint8_t * buffer, return 1; } +#if 0 static uint8_t TS_IO_Read(uint8_t reg) { return TS_IO_Read(TOUCH_FT6236_I2C_ADDRESS, reg); } +#endif static void touch_ft6236_debug_info(void) { @@ -333,6 +270,7 @@ static uint8_t ft6x06_TS_DetectTouch(uint16_t DeviceAddr) return (nbTouch); } +#if 0 /** * @brief Get the touch detailed informations on touch number 'touchIdx' (0..1) * This touch detailed information contains : @@ -384,7 +322,7 @@ static void ft6x06_TS_GetTouchInfo(uint16_t DeviceAddr, } /* of if(touchIdx < ft6x06_handle.currActiveTouchNb) */ } - +#endif /** * @brief Get the touch screen X and Y positions values @@ -432,9 +370,9 @@ static void ft6x06_TS_GetXY(uint16_t DeviceAddr, uint16_t * X, uint16_t * Y, uin void TouchReset() { - GPIO_ResetBits(I2C_TOUCH_RESET_GPIO, I2C_TOUCH_RESET_GPIO_PIN); + LL_GPIO_ResetOutputPin(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN); delay_ms(20); - GPIO_SetBits(I2C_TOUCH_RESET_GPIO, I2C_TOUCH_RESET_GPIO_PIN); + LL_GPIO_SetOutputPin(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN); delay_ms(300); } @@ -502,11 +440,15 @@ void handleTouch() } } -extern "C" void EXTI9_5_IRQHandler(void) +#if !defined(TOUCH_INT_EXTI_IRQHandler) + #error "TOUCH_INT_EXTI_IRQHandler is not defined" +#endif +extern "C" void TOUCH_INT_EXTI_IRQHandler(void) { - if (EXTI_GetITStatus(EXTI_Line9) != RESET) { - EXTI_ClearITPendingBit(EXTI_Line9); + if (LL_EXTI_IsEnabledIT_0_31(TOUCH_INT_EXTI_Line) && + LL_EXTI_IsActiveFlag_0_31(TOUCH_INT_EXTI_Line)) { touchEventOccured = true; + LL_EXTI_ClearFlag_0_31(TOUCH_INT_EXTI_Line); } } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 3a4128eb1..ab1bcb4f9 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -47,17 +47,6 @@ void rotaryEncoderCheck(); #define LUA_MEM_MAX (0) // max allowed memory usage for complete Lua (in bytes), 0 means unlimited -#if defined(STM32F4) - #define PERI1_FREQUENCY 42000000 - #define PERI2_FREQUENCY 84000000 -#else - #define PERI1_FREQUENCY 30000000 - #define PERI2_FREQUENCY 60000000 -#endif - -#define TIMER_MULT_APB1 2 -#define TIMER_MULT_APB2 2 - extern uint16_t sessionTimer; // Board driver diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 5691a8058..90aa1c298 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -24,10 +24,17 @@ #if defined(STM32F4) #define CPU_FREQ 168000000 + #define PERI1_FREQUENCY 42000000 + #define PERI2_FREQUENCY 84000000 #else #define CPU_FREQ 120000000 + #define PERI1_FREQUENCY 30000000 + #define PERI2_FREQUENCY 60000000 #endif +#define TIMER_MULT_APB1 2 +#define TIMER_MULT_APB2 2 + // Keys #if defined(PCBX9E) #define KEYS_GPIO_REG_MENU GPIOD->IDR @@ -1532,17 +1539,15 @@ #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) #define EXTMODULE_TX_GPIO GPIOC #define EXTMODULE_USART_GPIO EXTMODULE_TX_GPIO - #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PC.06 - #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource6 - #define EXTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PC.07 - #define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource7 + #define EXTMODULE_TX_GPIO_PIN LL_GPIO_PIN_6 // PC.06 + #define EXTMODULE_RX_GPIO_PIN LL_GPIO_PIN_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 GPIO_AF_TIM8 // TIM8_CH1 - #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 + #define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_7 #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 #define EXTMODULE_TIMER_DMA DMA2 #define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_1 @@ -1576,7 +1581,7 @@ #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N #define EXTMODULE_TIMER_IRQn TIM8_UP_TIM13_IRQn #define EXTMODULE_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler - #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 + #define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_7 #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 #define EXTMODULE_TIMER_DMA DMA2 #define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_1