drv_touch.h 5.3 KB

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