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