drv_gt911.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-05-26 Chushicheng the first version
  9. */
  10. #include "drv_gt911.h"
  11. #define LOG_TAG "drv.gt911"
  12. #include <drv_log.h>
  13. #ifndef BSP_TOUCH_I2C_BUS
  14. #define BSP_TOUCH_I2C_BUS "i2c1"
  15. #endif
  16. #define CAPT_I2C_ADDR (0x5D)
  17. #define GT911_REG_RT_CMD 0x8040U
  18. #define GT911_REG_RT_CMD_SW_RST_Pos 2U
  19. #define GT911_REG_RT_CMD_SW_RST_Msk (1U << GT911_REG_RT_CMD_SW_RST_Pos)
  20. #define GT911_REG_RT_CMD_READ_Pos 0U
  21. #define GT911_REG_RT_CMD_READ_Msk (1U << GT911_REG_RT_CMD_READ_Pos)
  22. #define GT911_REG_CONFIG_VERSION 0x8047U
  23. #define GT911_REG_MODULE_SW1 0x804DU
  24. #define GT911_REG_MODULE_SW1_INT_Pos 0U
  25. #define GT911_REG_MODULE_SW1_INT_Msk (3U << GT911_REG_MODULE_SW1_INT_Pos)
  26. #define GT911_REG_PRODUCT_ID 0x8140U
  27. #define GT911_REG_COORD 0x814EU
  28. #define GT911_REG_COORD_STATUS_Pos 7U
  29. #define GT911_REG_COORD_STATUS_Msk (1U << GT911_REG_COORD_STATUS_Pos)
  30. #define GT911_REG_POINT0 0x814FU
  31. static capt_t capt_obj;
  32. static rt_err_t gt911_ctp_read_reg(gt911_t *ctp, rt_uint16_t reg, rt_uint8_t *data, rt_uint16_t len);
  33. static rt_err_t gt911_ctp_write_reg(gt911_t *ctp, rt_uint16_t reg, rt_uint8_t data);
  34. static rt_err_t gt911_ctp_sw_reset(gt911_t *ctp);
  35. static rt_err_t gt911_ctp_read_config(gt911_t *ctp);
  36. static rt_err_t gt911_ctp_config_interrupt(gt911_t *ctp);
  37. static rt_err_t gt911_ctp_init(gt911_t *ctp);
  38. rt_err_t gt911_ctp_read(gt911_t *ctp, gt911_input_t *input);
  39. static rt_err_t gt911_ctp_init(gt911_t *ctp)
  40. {
  41. if (ctp->ops.reset)
  42. {
  43. if (ctp->ops.reset(ctp->user_data) != RT_EOK)
  44. {
  45. return -RT_ERROR;
  46. }
  47. }
  48. if (gt911_ctp_sw_reset(ctp) != RT_EOK)
  49. {
  50. return -RT_ERROR;
  51. }
  52. if (gt911_ctp_read_config(ctp) != RT_EOK)
  53. {
  54. return -RT_ERROR;
  55. }
  56. if (gt911_ctp_config_interrupt(ctp) != RT_EOK)
  57. {
  58. return -RT_ERROR;
  59. }
  60. return RT_EOK;
  61. }
  62. rt_err_t gt911_ctp_read(gt911_t *ctp, gt911_input_t *input)
  63. {
  64. rt_uint8_t rx_data[40] = {0};
  65. if (gt911_ctp_read_reg(ctp, GT911_REG_COORD, rx_data, 1) != RT_EOK)
  66. {
  67. return -RT_ERROR;
  68. }
  69. if ((rx_data[0] & GT911_REG_COORD_STATUS_Msk) == 0)
  70. {
  71. input->num_pos = 0U;
  72. return RT_EOK;
  73. }
  74. input->num_pos = rx_data[0] & 0x0F;
  75. if (gt911_ctp_read_reg(ctp, GT911_REG_POINT0, rx_data, 40) != RT_EOK)
  76. {
  77. return -RT_ERROR;
  78. }
  79. for (rt_uint8_t i = 0; i < input->num_pos; i++)
  80. {
  81. rt_uint8_t point_offset = 8 * i; /* Each point has 8 bytes */
  82. input->pos[i].id = rx_data[point_offset]; /* 0x00: Track ID */
  83. input->pos[i].pos_x = rx_data[point_offset + 1] | (rx_data[point_offset + 2] << 8U); /* 0x01-0x02: X coord */
  84. input->pos[i].pos_y = rx_data[point_offset + 3] | (rx_data[point_offset + 4] << 8U); /* 0x03-0x04: Y coord */
  85. input->pos[i].size = rx_data[point_offset + 5] | (rx_data[point_offset + 6] << 8U); /* 0x05-0x06: Size*/
  86. }
  87. /* Clear buffer status latch, ready for new data */
  88. gt911_ctp_write_reg(ctp, GT911_REG_COORD, 0x00);
  89. return RT_EOK;
  90. }
  91. static rt_err_t gt911_ctp_read_reg(gt911_t *ctp, rt_uint16_t reg, rt_uint8_t *data, rt_uint16_t len)
  92. {
  93. rt_uint8_t tx_data[2] = {(reg >> 8U), (reg & 0xFFU)};
  94. gt911_i2c_xfer_t xfer =
  95. {
  96. .tx_data = tx_data,
  97. .rx_data = data,
  98. .tx_len = 2,
  99. .rx_len = len,
  100. };
  101. return ctp->ops.xfer(ctp->user_data, &xfer);
  102. }
  103. static rt_err_t gt911_ctp_write_reg(gt911_t *ctp, rt_uint16_t reg, rt_uint8_t data)
  104. {
  105. rt_uint8_t tx_data[3] = {(reg >> 8U), (reg & 0xFFU), data};
  106. gt911_i2c_xfer_t xfer =
  107. {
  108. .tx_data = tx_data,
  109. .rx_data = NULL,
  110. .tx_len = 3,
  111. .rx_len = 0,
  112. };
  113. return ctp->ops.xfer(ctp->user_data, &xfer);
  114. }
  115. static rt_err_t gt911_ctp_sw_reset(gt911_t *ctp)
  116. {
  117. return gt911_ctp_write_reg(ctp, GT911_REG_RT_CMD, (GT911_REG_RT_CMD_SW_RST_Msk));
  118. }
  119. static rt_err_t gt911_ctp_read_config(gt911_t *ctp)
  120. {
  121. rt_uint8_t rx_data[7];
  122. if (gt911_ctp_read_reg(ctp, GT911_REG_CONFIG_VERSION, rx_data, 7) != RT_EOK)
  123. {
  124. return -RT_ERROR;
  125. }
  126. ctp->fw_version = rx_data[0]; /* 0x8047, Config Version */
  127. ctp->pos_x_max = rx_data[1] | (rx_data[2] << 8U); /* 0x8048-0x8049, Maximum X */
  128. ctp->pos_y_max = rx_data[3] | (rx_data[4] << 8U); /* 0x804A-0x804B, Maximum Y */
  129. ctp->pos_max = rx_data[5] & 0x0FU; /* 0x804C, Maximum positions */
  130. return RT_EOK;
  131. }
  132. static rt_err_t gt911_ctp_config_interrupt(gt911_t *ctp)
  133. {
  134. rt_uint8_t mod_sw1 = 0x00U;
  135. if (gt911_ctp_read_reg(ctp, GT911_REG_MODULE_SW1, &mod_sw1, 0x01) != RT_EOK)
  136. {
  137. return -RT_ERROR;
  138. }
  139. mod_sw1 &= ~(GT911_REG_MODULE_SW1_INT_Msk);
  140. mod_sw1 |= (ctp->int_mode & GT911_REG_MODULE_SW1_INT_Msk);
  141. return gt911_ctp_write_reg(ctp, GT911_REG_MODULE_SW1, mod_sw1);
  142. }
  143. static rt_err_t ctp_impl_xfer(void *handle, gt911_i2c_xfer_t *xfer)
  144. {
  145. capt_t *capt = (capt_t*)handle;
  146. if(xfer->tx_len) rt_i2c_master_send(capt->bus, CAPT_I2C_ADDR, 0, xfer->tx_data, xfer->tx_len);
  147. if(xfer->rx_len) rt_i2c_master_recv(capt->bus, CAPT_I2C_ADDR, 0, xfer->rx_data, xfer->rx_len);
  148. return RT_EOK;
  149. }
  150. int drv_capt_hw_init(void)
  151. {
  152. capt_obj.bus = (struct rt_i2c_bus_device*)rt_device_find(BSP_TOUCH_I2C_BUS);
  153. if(capt_obj.bus == RT_NULL)
  154. {
  155. LOG_E("no %s device", BSP_TOUCH_I2C_BUS);
  156. return -RT_ERROR;
  157. }
  158. capt_obj.gt911.user_data = capt_obj.parent.user_data = &capt_obj;
  159. capt_obj.gt911.ops.xfer = ctp_impl_xfer;
  160. if(gt911_ctp_init(&capt_obj.gt911) != RT_EOK)
  161. {
  162. return -RT_ERROR;
  163. }
  164. rt_device_register(&capt_obj.parent, "capt", RT_DEVICE_FLAG_RDWR);
  165. return RT_EOK;
  166. }
  167. INIT_COMPONENT_EXPORT(drv_capt_hw_init);