summaryrefslogtreecommitdiff
path: root/bsp/gd32/arm/gd32470i-eval/board/ports/drv_touch.h
blob: 24784e0eecec778a4dc8e1e294a7d31a7038c6ce (plain)
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