1 /* 2 * Copyright (c) 2006-2025, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2025-05-23 godmial Refactor to conform to RT-Thread coding style. 9 */ 10 11 #ifndef __TOUCH_H__ 12 #define __TOUCH_H__ 13 14 #include "stdio.h" 15 #include "string.h" 16 #include "gd32f4xx.h" 17 18 19 #define SCL_RCU RCU_GPIOB 20 #define SCL_PORT GPIOB 21 #define SCL_PIN GPIO_PIN_6 22 #define SCL_ON gpio_bit_set(SCL_PORT, SCL_PIN) 23 #define SCL_OFF gpio_bit_reset(SCL_PORT, SCL_PIN) 24 #define SCL_TOGGLE gpio_bit_toggle(SCL_PORT, SCL_PIN) 25 26 #define SDA_RCU RCU_GPIOB 27 #define SDA_PORT GPIOB 28 #define SDA_PIN GPIO_PIN_7 29 #define SDA_ON gpio_bit_set(SDA_PORT, SDA_PIN) 30 #define SDA_OFF gpio_bit_reset(SDA_PORT, SDA_PIN) 31 #define SDA_TOGGLE gpio_bit_toggle(SDA_PORT, SDA_PIN) 32 33 /* IO direction settings */ 34 #define CT_SDA_IN() gpio_mode_set(SCL_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, SDA_PIN); //{GPIOF->MODER&=~(3<<(2*11));GPIOF->MODER|=0<<2*11;} //PF11输入模式 35 #define CT_SDA_OUT() gpio_mode_set(SCL_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, SDA_PIN); //{GPIOF->MODER&=~(3<<(2*11));GPIOF->MODER|=1<<2*11;} //PF11输出模式 36 /* IO operations */ 37 #define CT_IIC_SCL // PBout(0) //SCL 38 #define CT_IIC_SDA(val) ((val) == 1 ? SDA_ON : SDA_OFF) // PFout(11) //SDA 39 #define CT_READ_SDA gpio_input_bit_get(SDA_PORT, SDA_PIN) // PFin(11) //输入SDA 40 /* Reset and interrupt pin definitions */ 41 #define RST_RCU RCU_GPIOD 42 #define RST_PORT GPIOD 43 #define RST_PIN GPIO_PIN_12 44 #define RST_ON gpio_bit_set(RST_PORT, RST_PIN); 45 #define RST_OFF gpio_bit_reset(RST_PORT, RST_PIN); 46 #define RST_TOGGLE gpio_bit_toggle(RST_PORT, RST_PIN); 47 48 #define INT_RCU RCU_GPIOD 49 #define INT_PORT GPIOD 50 #define INT_PIN GPIO_PIN_11 51 #define INT_ON gpio_bit_set(INT_PORT, INT_PIN); 52 #define INT_OFF gpio_bit_reset(INT_PORT, INT_PIN); 53 #define INT_TOGGLE gpio_bit_toggle(INT_PORT, INT_PIN); 54 55 /* I2C command definitions */ 56 #define FT_CMD_WR 0X70 /**< FT5206 write command */ 57 #define FT_CMD_RD 0X71 /**< FT5206 read command */ 58 /* FT5206 register definitions */ 59 #define FT_DEVIDE_MODE 0x00 /**< Mode control register */ 60 #define FT_REG_NUM_FINGER 0x02 /**< Touch status register */ 61 #define FT_TP1_REG 0x03 /**< Touch point 1 data */ 62 #define FT_TP2_REG 0x09 /**< Touch point 2 data */ 63 #define FT_TP3_REG 0x0F /**< Touch point 3 data */ 64 #define FT_TP4_REG 0x15 /**< Touch point 4 data */ 65 #define FT_TP5_REG 0x1B /**< Touch point 5 data */ 66 #define FT_ID_G_LIB_VERSION 0xA1 /**< Firmware version */ 67 #define FT_ID_G_MODE 0xA4 /**< Interrupt mode control */ 68 #define FT_ID_G_THGROUP 0x80 /**< Touch sensitivity */ 69 #define FT_ID_G_PERIODACTIVE 0x88 /**< Active period register */ 70 71 #define TP_PRES_DOWN 0x80 /**< Touch pressed flag */ 72 #define TP_CATH_PRES 0x40 /**< Key press detected flag */ 73 #define CT_MAX_TOUCH 5 /**< Maximum number of supported touch points */ 74 /** 75 * @brief Touch point device structure. 76 */ 77 typedef struct 78 { 79 uint16_t x[CT_MAX_TOUCH]; /**< X coordinates of touch points */ 80 uint16_t y[CT_MAX_TOUCH]; /**< Y coordinates of touch points */ 81 uint8_t sta; /**< Touch status flag */ 82 float xfac; /**< X axis scaling factor */ 83 float yfac; /**< Y axis scaling factor */ 84 short xoff; /**< X axis offset */ 85 short yoff; /**< Y axis offset */ 86 uint8_t touchtype; /**< Touch type flag */ 87 } _m_tp_dev; 88 89 extern _m_tp_dev tp_dev; 90 91 /** 92 * @brief Initialize I2C GPIO lines. 93 */ 94 void CT_IIC_Init(void); 95 96 /** 97 * @brief Generate I2C start condition. 98 */ 99 void CT_IIC_Start(void); 100 101 /** 102 * @brief Generate I2C stop condition. 103 */ 104 void CT_IIC_Stop(void); 105 106 /** 107 * @brief Send a byte over I2C. 108 * 109 * @param txd Byte to send. 110 */ 111 void CT_IIC_Send_Byte(uint8_t txd); 112 113 /** 114 * @brief Read a byte over I2C. 115 * 116 * @param ack 1 to send ACK after read, 0 for NACK. 117 * 118 * @return The received byte. 119 */ 120 uint8_t CT_IIC_Read_Byte(unsigned char ack); 121 122 /** 123 * @brief Wait for I2C ACK. 124 * 125 * @return 0 on success, non-zero on timeout. 126 */ 127 uint8_t CT_IIC_Wait_Ack(void); 128 129 /** 130 * @brief Generate I2C ACK. 131 */ 132 void CT_IIC_Ack(void); 133 134 /** 135 * @brief Generate I2C NACK. 136 */ 137 void CT_IIC_NAck(void); 138 139 /** 140 * @brief Write data to FT5206 register. 141 * 142 * @param reg Register address. 143 * @param buf Pointer to data. 144 * @param len Number of bytes to write. 145 * 146 * @return 0 if success, non-zero otherwise. 147 */ 148 uint8_t FT5206_WR_Reg(uint16_t reg, uint8_t *buf, uint8_t len); 149 150 /** 151 * @brief Read data from FT5206 register. 152 * 153 * @param reg Register address. 154 * @param buf Buffer to store data. 155 * @param len Number of bytes to read. 156 */ 157 void FT5206_RD_Reg(uint16_t reg, uint8_t *buf, uint8_t len); 158 159 /** 160 * @brief Initialize the FT5206 touch controller. 161 * 162 * @return 0 if successful. 163 */ 164 uint8_t FT5206_Init(void); 165 166 /** 167 * @brief Poll the FT5206 for touch input. 168 * 169 * @param mode Scan mode. 170 * 171 * @return 1 if touch detected, 0 otherwise. 172 */ 173 uint8_t FT5206_Scan(uint8_t mode); 174 175 /** 176 * @brief Wait until touch contact leaves specified area. 177 * 178 * @param contact Touch point index. 179 * @param sx Start X coordinate. 180 * @param sy Start Y coordinate. 181 * @param ex End X coordinate. 182 * @param ey End Y coordinate. 183 */ 184 void letgo_scan(uint16_t contact, uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey); 185 186 187 #endif 188