chore: Update NV14/EL18 touch driver to generic EXTI driver (#4159)

This commit is contained in:
richardclli
2023-10-10 18:38:36 +10:00
committed by GitHub
parent f4f04c1827
commit b05044091a
3 changed files with 58 additions and 118 deletions
+1 -1
View File
@@ -146,7 +146,7 @@ set(FIRMWARE_TARGET_SRC
set(FIRMWARE_SRC
${FIRMWARE_SRC}
hal/adc_driver.cpp
targets/common/arm/stm32/stm32_adc.cpp
targets/common/arm/stm32/stm32_exti_driver.cpp
targets/common/arm/stm32/timers_driver.cpp
targets/common/arm/stm32/stm32_pulse_driver.cpp
targets/common/arm/stm32/stm32_usart_driver.cpp
+8 -3
View File
@@ -359,8 +359,9 @@
#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 I2C_B1_GPIO_AF LL_GPIO_AF_4
// Touch
#define TOUCH_I2C_BUS I2C_Bus_1
#define TOUCH_I2C_CLK_RATE 400000
@@ -373,8 +374,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
// TOUCH_INT_EXTI IRQ
#if !defined(USE_EXTI9_5_IRQ)
#define USE_EXTI9_5_IRQ
#define EXTI9_5_IRQ_Priority 9
#endif
// Haptic: TIM1_CH1
#define HAPTIC_PWM
+49 -114
View File
@@ -21,11 +21,11 @@
#include "stm32_hal_ll.h"
#include "stm32_hal.h"
#include "hal.h"
#include "stm32_i2c_driver.h"
#include "stm32_gpio_driver.h"
#include "stm32_exti_driver.h"
#include "hal.h"
#include "timers_driver.h"
#include "delays_driver.h"
#include "touch_driver.h"
@@ -36,12 +36,6 @@ volatile static bool touchEventOccured;
#define FT6x06_MAX_INSTANCE 1
#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 TOUCH_FT6236_I2C_ADDRESS (0x70>>1)
#define TOUCH_CST836U_I2C_ADDRESS (0x15)
@@ -67,59 +61,59 @@ static const TouchControllerDescriptor *tc = nullptr;
static TouchState internalTouchState = {};
void I2C_FreeBus()
static void _cst836u_exti_isr(void)
{
touchEventOccured = true;
}
static void TOUCH_AF_ExtiStop(void)
{
stm32_exti_disable(TOUCH_INT_EXTI_Line);
}
static void TOUCH_AF_ExtiConfig(void)
{
__HAL_RCC_SYSCFG_CLK_ENABLE();
LL_SYSCFG_SetEXTISource(TOUCH_INT_EXTI_Port, TOUCH_INT_EXTI_SysCfgLine);
stm32_exti_enable(TOUCH_INT_EXTI_Line,
LL_EXTI_TRIGGER_FALLING,
_cst836u_exti_isr);
}
static void TOUCH_AF_GPIOConfig(void)
{
LL_GPIO_InitTypeDef gpioInit;
LL_GPIO_StructInit(&gpioInit);
// reset i2c bus by setting clk as output and sending manual clock pulses
gpioInit.Pin = TOUCH_SCL_GPIO_PIN;
stm32_gpio_enable_clock(TOUCH_RST_GPIO);
stm32_gpio_enable_clock(TOUCH_INT_GPIO);
gpioInit.Mode = LL_GPIO_MODE_OUTPUT;
gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW;
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.Pin = TOUCH_RST_GPIO_PIN;
LL_GPIO_Init(TOUCH_RST_GPIO, &gpioInit);
LL_GPIO_SetOutputPin(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN);
gpioInit.Pin = TOUCH_INT_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);
gpioInit.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
LL_GPIO_Init(TOUCH_INT_GPIO, &gpioInit);
LL_GPIO_SetOutputPin(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN);
}
//send 100khz clock train for some 100ms
tmr10ms_t until = get_tmr10ms() + 11;
while (get_tmr10ms() < until) {
if (LL_GPIO_IsInputPinSet(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN)) {
TRACE("touch: i2c free again\n");
break;
}
TRACE("FREEEEE");
LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN);
delay_us(10);
LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN);
delay_us(10);
void I2C_Init_Radio(void)
{
TRACE("CST836U I2C Init");
if (stm32_i2c_init(TOUCH_I2C_BUS, TOUCH_I2C_CLK_RATE) < 0) {
TRACE("CST836U ERROR: stm32_i2c_init failed");
return;
}
//send stop condition:
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
LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN);
delay_us(10);
//sda = lo
LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN);
delay_us(10);
//clock goes high
LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN);
delay_us(10);
//sda = hi
LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN);
delay_us(10);
TRACE("FREE BUS");
}
// void Touch_DeInit()
@@ -130,56 +124,6 @@ void I2C_FreeBus()
// __HAL_RCC_I2C1_RELEASE_RESET();
// }
void I2C_Init()
{
stm32_i2c_deinit(TOUCH_I2C_BUS);
stm32_gpio_enable_clock(TOUCH_GPIO);
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_RCC_I2C1_CLK_ENABLE();
__HAL_RCC_I2C1_CLK_DISABLE();
I2C_FreeBus();
stm32_i2c_init(TOUCH_I2C_BUS, TOUCH_I2C_CLK_RATE);
LL_GPIO_InitTypeDef gpioInit;
LL_GPIO_StructInit(&gpioInit);
stm32_gpio_enable_clock(TOUCH_RST_GPIO);
stm32_gpio_enable_clock(TOUCH_INT_GPIO);
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
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);
LL_SYSCFG_SetEXTISource(TOUCH_INT_EXTI_Port, TOUCH_INT_EXTI_SysCfgLine);
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 5 // 5 ms
bool touch_i2c_read(uint8_t addr, uint8_t reg, uint8_t * data, uint8_t len)
@@ -224,7 +168,7 @@ static uint8_t TS_IO_Read(uint8_t addr, uint8_t reg)
uint8_t tryCount = 3;
while (!touch_i2c_read(addr, reg, &retult, 1)) {
if (--tryCount == 0) break;
I2C_Init();
I2C_Init_Radio();
}
return retult;
}
@@ -234,7 +178,7 @@ static uint16_t TS_IO_ReadMultiple(uint8_t addr, uint8_t reg, uint8_t * buffer,
uint8_t tryCount = 3;
while (!touch_i2c_read(addr, reg, buffer, length)) {
if (--tryCount == 0) break;
I2C_Init();
I2C_Init_Radio();
}
return 1;
}
@@ -489,9 +433,12 @@ void detectTouchController()
void TouchInit(void)
{
I2C_Init();
TOUCH_AF_GPIOConfig();
I2C_Init_Radio();
TouchReset();
detectTouchController();
TOUCH_AF_ExtiConfig();
tc->printDebugInfo();
}
@@ -543,18 +490,6 @@ void handleTouch()
}
}
#if !defined(TOUCH_INT_EXTI_IRQHandler)
#error "TOUCH_INT_EXTI_IRQHandler is not defined"
#endif
extern "C" void TOUCH_INT_EXTI_IRQHandler(void)
{
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);
}
}
bool touchPanelEventOccured()
{
return touchEventOccured;