hpm_gt9xx.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /*
  2. * Copyright (c) 2021 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #include "hpm_gt9xx.h"
  8. static uint8_t g_i2c_addr;
  9. hpm_stat_t gt9xx_read_data(gt9xx_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 gt9xx_write_data(gt9xx_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 gt9xx_read_register(gt9xx_context_t *context, uint16_t reg, uint8_t *buf)
  24. {
  25. return gt9xx_read_data(context, reg, buf, 1);
  26. }
  27. hpm_stat_t gt9xx_write_register(gt9xx_context_t *context, uint16_t reg, uint8_t val)
  28. {
  29. return gt9xx_write_data(context, reg, &val, 1);
  30. }
  31. hpm_stat_t gt9xx_soft_reset(gt9xx_context_t *context)
  32. {
  33. return gt9xx_write_register(context, GT9XX_CMD, 0);
  34. }
  35. static uint8_t gt9xx_calcualte_config_data_checksum(uint8_t *config)
  36. {
  37. uint8_t checksum = 0;
  38. for (uint32_t i = 0; i < GT9XX_CONFIG_DATA_SIZE - 2; i++) {
  39. checksum += config[i];
  40. }
  41. return (~checksum + 1);
  42. }
  43. hpm_stat_t gt9xx_read_config(gt9xx_context_t *context, uint8_t *buf, uint8_t size)
  44. {
  45. return gt9xx_read_data(context, GT9XX_CONFIG, buf, size);
  46. }
  47. hpm_stat_t gt9xx_init(gt9xx_context_t *context, uint16_t width, uint16_t height)
  48. {
  49. hpm_stat_t stat = status_success;
  50. uint8_t config[GT9XX_CONFIG_DATA_SIZE] = {0};
  51. #ifdef GT9XX_I2C_ADDR
  52. g_i2c_addr = GT9XX_I2C_ADDR;
  53. stat = gt9xx_read_data(context, GT9XX_CONFIG, config, sizeof(config));
  54. if (stat != status_success) {
  55. return stat;
  56. }
  57. #elif !GT9XX_NO_AUTO_PROBE
  58. g_i2c_addr = GT9XX_I2C_ADDR0;
  59. stat = gt9xx_read_data(context, GT9XX_CONFIG, config, sizeof(config));
  60. if (stat != status_success) {
  61. printf("0x%x failed to init GT9XX", g_i2c_addr);
  62. g_i2c_addr = GT9XX_I2C_ADDR1;
  63. printf(", try 0x%x\n", g_i2c_addr);
  64. stat = gt9xx_read_data(context, GT9XX_CONFIG, config, sizeof(config));
  65. }
  66. if (stat != status_success) {
  67. return stat;
  68. }
  69. #else
  70. g_i2c_addr = GT9XX_I2C_ADDR0;
  71. stat = gt9xx_read_data(context, GT9XX_CONFIG, config, sizeof(config));
  72. if (stat != status_success) {
  73. return stat;
  74. }
  75. #endif
  76. if (config[GT9XX_CONFIG_DATA_SIZE - 2] != gt9xx_calcualte_config_data_checksum(config)) {
  77. return status_fail;
  78. }
  79. /* < 90: fixed config; >=90 custom config */
  80. if (config[GT9XX_CONFIG_DATA_CONFIG_VERSION] < 90) {
  81. printf("ERR: GTXXX custom config can't be supported\n");
  82. return status_fail;
  83. } else {
  84. context->abs_x_max = config[GT9XX_CONFIG_DATA_RESOLUTION_XH];
  85. context->abs_x_max <<= 8;
  86. context->abs_x_max |= config[GT9XX_CONFIG_DATA_RESOLUTION_XL];
  87. context->abs_y_max = config[GT9XX_CONFIG_DATA_RESOLUTION_YH];
  88. context->abs_y_max <<= 8;
  89. context->abs_y_max |= config[GT9XX_CONFIG_DATA_RESOLUTION_YL];
  90. }
  91. /* stat = gt9xx_read_data(context, GT9XX_ID_B0, (uint8_t*)&val, sizeof(val)); */
  92. /* if (stat != status_success) { */
  93. /* return stat; */
  94. /* } */
  95. /* if (val != GT9XX_PRODUCT_ID) { */
  96. /* return status_fail; */
  97. /* } */
  98. config[GT9XX_CONFIG_DATA_RESOLUTION_XL] = width & 0xFF;
  99. config[GT9XX_CONFIG_DATA_RESOLUTION_XH] = width >> 8;
  100. config[GT9XX_CONFIG_DATA_RESOLUTION_YL] = height & 0xFF;
  101. config[GT9XX_CONFIG_DATA_RESOLUTION_YH] = height >> 8;
  102. config[GT9XX_CONFIG_DATA_TOUCH_NUMBER] = 5;
  103. config[GT9XX_CONFIG_DATA_MODULE_SWITCH1] = (config[GT9XX_CONFIG_DATA_MODULE_SWITCH1] & ~0x3);
  104. config[GT9XX_CONFIG_DATA_SIZE - 2] = gt9xx_calcualte_config_data_checksum(config);
  105. config[GT9XX_CONFIG_DATA_SIZE - 1] = 1;
  106. /*
  107. * for (uint8_t i = 0; i < 5; i++) {
  108. * gt9xx_write_data(context, GT9XX_CONFIG, config, GT9XX_CONFIG_DATA_SIZE);
  109. * }
  110. */
  111. gt9xx_write_register(context, GT9XX_CMD, GT9XX_CMD_SOFT_RESET);
  112. return status_success;
  113. }
  114. hpm_stat_t gt9xx_read_touch_data(gt9xx_context_t *context,
  115. gt9xx_touch_data_t *touch_data)
  116. {
  117. hpm_stat_t stat = status_success;
  118. stat = gt9xx_read_data(context, GT9XX_STATUS,
  119. (uint8_t *)touch_data, sizeof(gt9xx_touch_data_t));
  120. if (stat != status_success) {
  121. return stat;
  122. }
  123. return stat;
  124. }