feat(st16): support touch panel mod (#7334)

This commit is contained in:
SakuraHlh
2026-06-25 18:04:08 +10:00
committed by GitHub
parent 0a659087b4
commit eae6aa1c69
2 changed files with 74 additions and 12 deletions
+16
View File
@@ -317,6 +317,22 @@
#define TOUCH_I2C_BUS I2C_Bus_1
#define TOUCH_I2C_CLK_RATE 100000
// Touch pins: INT -> PI11, RST -> PI3
#define TOUCH_INT_GPIO GPIOI
#define TOUCH_INT_GPIO_PIN LL_GPIO_PIN_11
#define TOUCH_RST_GPIO GPIOI
#define TOUCH_RST_GPIO_PIN LL_GPIO_PIN_3
#define TOUCH_INT_EXTI_Line LL_EXTI_LINE_11
#define TOUCH_INT_EXTI_Port LL_SYSCFG_EXTI_PORTI
#define TOUCH_INT_EXTI_SysCfgLine LL_SYSCFG_EXTI_LINE11
// TOUCH_INT_EXTI IRQ for lines 15..10
#if !defined(USE_EXTI15_10_IRQ)
#define USE_EXTI15_10_IRQ
#define EXTI15_10_IRQ_Priority 5
#endif
#define IMU_I2C_BUS I2C_Bus_1
#define IMU_I2C_ADDRESS 0x6A
+58 -12
View File
@@ -25,6 +25,8 @@
#include "stm32_gpio_driver.h"
#include "stm32_exti_driver.h"
#include "hal/i2c_driver.h"
#include "hal.h"
#include "timers_driver.h"
#include "delays_driver.h"
@@ -109,15 +111,62 @@ static tmr10ms_t downTime = 0;
static tmr10ms_t tapTime = 0;
static short tapCount = 0;
// static void _touch_exti_isr(void)
// {
// touchEventOccured = true;
// }
static void _touch_exti_isr(void)
{
touchEventOccured = true;
}
static void _touch_exti_stop(void) {
stm32_exti_disable(TOUCH_INT_EXTI_Line);
}
static void _touch_exti_config(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,
_touch_exti_isr);
}
static void _touch_gpio_config(void) {
LL_GPIO_InitTypeDef gpioInit;
LL_GPIO_StructInit(&gpioInit);
// Enable clocks for the GPIO ports used by touch
stm32_gpio_enable_clock(TOUCH_RST_GPIO);
stm32_gpio_enable_clock(TOUCH_INT_GPIO);
// Configure RST as output, push-pull
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.Pin = TOUCH_RST_GPIO_PIN;
LL_GPIO_Init(TOUCH_RST_GPIO, &gpioInit);
LL_GPIO_SetOutputPin(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN);
// Configure INT as input with pull-up (10k external pull-up also present)
gpioInit.Pin = TOUCH_INT_GPIO_PIN;
gpioInit.Mode = LL_GPIO_MODE_INPUT;
gpioInit.Pull = LL_GPIO_PULL_UP;
gpioInit.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
LL_GPIO_Init(TOUCH_INT_GPIO, &gpioInit);
LL_GPIO_SetOutputPin(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN);
// Init I2C bus used by touch (use platform i2c wrapper)
if (i2c_init(TOUCH_I2C_BUS) < 0) {
TRACE("Touch I2C Init ERROR: i2c_init failed");
}
}
static void _touch_reset() {
LL_GPIO_ResetOutputPin(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN);
delay_ms(10);
LL_GPIO_SetOutputPin(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN);
delay_ms(300);
}
static void _touch_exti_stop(void) {}
static void _touch_exti_config(void) {}
static void _touch_gpio_config(void) {}
static void _touch_reset() {}
static int _i2c_read(uint8_t addr, uint32_t reg, uint8_t regSize, uint8_t* data, uint16_t len, uint32_t timeout, bool forceLong = false)
{
@@ -177,8 +226,6 @@ static bool ft6236TouchRead(uint16_t * X, uint16_t * Y)
static bool ft6236HasTouchEvent()
{
touchEventOccured = true;
return true;
return touchEventOccured;
}
@@ -280,9 +327,8 @@ static bool cst836uTouchRead(uint16_t * X, uint16_t * Y)
static bool cst836uHasTouchEvent()
{
static bool lastHasTouch = false;
touchEventOccured = true;
bool ret = touchEventOccured;
if (ret||1) {
if (ret) {
uint8_t data;
_i2c_readMultipleRetry(TOUCH_CST836U_I2C_ADDRESS, TOUCH_CST836U_TOUCH_NUM_REG, 1, &data, sizeof(data), true);
uint8_t hasTouch = data;