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