hpm_gt911.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * Copyright (c) 2021 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #include "hpm_gt911.h"
  8. static uint8_t g_i2c_addr;
  9. hpm_stat_t gt911_read_data(gt911_context_t *context, uint16_t addr, uint8_t *buf, uint32_t size)
  10. {
  11. uint8_t r[2];
  12. r[0] = addr >> 8;
  13. r[1] = addr & 0xFF;
  14. return i2c_master_address_read(context->ptr, g_i2c_addr, r, sizeof(r), buf, size);
  15. }
  16. hpm_stat_t gt911_write_data(gt911_context_t *context, uint16_t addr, uint8_t *buf, uint32_t size)
  17. {
  18. uint8_t r[2];
  19. r[0] = addr >> 8;
  20. r[1] = addr & 0xFF;
  21. return i2c_master_address_write(context->ptr, g_i2c_addr, r, sizeof(r), buf, size);
  22. }
  23. hpm_stat_t gt911_read_register(gt911_context_t *context, uint16_t reg, uint8_t *buf)
  24. {
  25. return gt911_read_data(context, reg, buf, 1);
  26. }
  27. hpm_stat_t gt911_write_register(gt911_context_t *context, uint16_t reg, uint8_t val)
  28. {
  29. return gt911_write_data(context, reg, &val, 1);
  30. }
  31. hpm_stat_t gt911_soft_reset(gt911_context_t *context)
  32. {
  33. return gt911_write_register(context, GT911_CMD, 0);
  34. }
  35. static uint8_t gt911_calcualte_config_data_checksum(uint8_t *config)
  36. {
  37. uint8_t checksum = 0;
  38. for (uint32_t i = 0; i < GT911_CONFIG_DATA_SIZE - 2; i++) {
  39. checksum += config[i];
  40. }
  41. return (~checksum + 1);
  42. }
  43. hpm_stat_t gt911_read_config(gt911_context_t *context, uint8_t *buf, uint8_t size)
  44. {
  45. return gt911_read_data(context, GT911_CONFIG, buf, size);
  46. }
  47. hpm_stat_t gt911_init(gt911_context_t *context, uint16_t width, uint16_t height)
  48. {
  49. hpm_stat_t stat = status_success;
  50. uint8_t config[GT911_CONFIG_DATA_SIZE] = {0};
  51. #ifdef GT911_I2C_ADDR
  52. g_i2c_addr = GT911_I2C_ADDR;
  53. stat = gt911_read_data(context, GT911_CONFIG, config, sizeof(config));
  54. if (stat != status_success) {
  55. return stat;
  56. }
  57. #elif !GT911_NO_AUTO_PROBE
  58. g_i2c_addr = GT911_I2C_ADDR0;
  59. stat = gt911_read_data(context, GT911_CONFIG, config, sizeof(config));
  60. if (stat != status_success) {
  61. printf("0x%x failed to init GT911", g_i2c_addr);
  62. g_i2c_addr = GT911_I2C_ADDR1;
  63. printf(", try 0x%x\n", g_i2c_addr);
  64. stat = gt911_read_data(context, GT911_CONFIG, config, sizeof(config));
  65. }
  66. if (stat != status_success) {
  67. return stat;
  68. }
  69. #else
  70. g_i2c_addr = GT911_I2C_ADDR0;
  71. stat = gt911_read_data(context, GT911_CONFIG, config, sizeof(config));
  72. if (stat != status_success) {
  73. return stat;
  74. }
  75. #endif
  76. if (config[GT911_CONFIG_DATA_SIZE - 2] != gt911_calcualte_config_data_checksum(config)) {
  77. return status_fail;
  78. }
  79. /* stat = gt911_read_data(context, GT911_ID_B0, (uint8_t*)&val, sizeof(val)); */
  80. /* if (stat != status_success) { */
  81. /* return stat; */
  82. /* } */
  83. /* if (val != GT911_PRODUCT_ID) { */
  84. /* return status_fail; */
  85. /* } */
  86. config[GT911_CONFIG_DATA_RESOLUTION_XL] = width & 0xFF;
  87. config[GT911_CONFIG_DATA_RESOLUTION_XH] = width >> 8;
  88. config[GT911_CONFIG_DATA_RESOLUTION_YL] = height & 0xFF;
  89. config[GT911_CONFIG_DATA_RESOLUTION_YH] = height >> 8;
  90. config[GT911_CONFIG_DATA_TOUCH_NUMBER] = 5;
  91. config[GT911_CONFIG_DATA_MODULE_SWITCH1] = (config[GT911_CONFIG_DATA_MODULE_SWITCH1] & ~0x3);
  92. config[GT911_CONFIG_DATA_SIZE - 2] = gt911_calcualte_config_data_checksum(config);
  93. config[GT911_CONFIG_DATA_SIZE - 1] = 1;
  94. /*
  95. * for (uint8_t i = 0; i < 5; i++) {
  96. * gt911_write_data(context, GT911_CONFIG, config, GT911_CONFIG_DATA_SIZE);
  97. * }
  98. */
  99. gt911_write_register(context, GT911_CMD, GT911_CMD_SOFT_RESET);
  100. return status_success;
  101. }
  102. hpm_stat_t gt911_read_touch_data(gt911_context_t *context,
  103. gt911_touch_data_t *touch_data)
  104. {
  105. hpm_stat_t stat = status_success;
  106. stat = gt911_read_data(context, GT911_STATUS,
  107. (uint8_t *)touch_data, sizeof(gt911_touch_data_t));
  108. if (stat != status_success) {
  109. return stat;
  110. }
  111. gt911_write_register(context, GT911_STATUS, 0);
  112. return stat;
  113. }