luat_tp_jd9261t.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. #include "luat_base.h"
  2. #include "luat_tp.h"
  3. #include "luat_gpio.h"
  4. #include "luat_mem.h"
  5. #include "luat_rtos.h"
  6. #include "luat_tp_reg.h"
  7. #define LUAT_LOG_TAG "jd9261t"
  8. #include "luat_log.h"
  9. #define JT9261T_ADDRESS0 (0x68)
  10. #define JT9261T_ADDRESS1 (0x14)
  11. #define JT9261T_PRODUCT_ID_CODE (0x9062)
  12. #define JT9261T_REG_RESET (0x40008004)
  13. #define JT9261T_CMD_RESET (0xA5)
  14. #define JT9261T_POR_INIT_REG (0x40008081)
  15. #define JT9261T_PRODUCT_ID (0x40008076)
  16. #define JT9261T_READ_COOR_ADDR (0x20011120)
  17. #define JT9261T_REG_SLEEP (0x8040)
  18. #define JT9261T_REG_SENSOR_ID (0x814A)
  19. #define JT9261T_REG_CONFIG_DATA (0x8047)
  20. #define JT9261T_REG_VERSION (0x8140)
  21. #define JT9261T_REG_READ_POINT (0x8150)
  22. #define JT9261T_REG_MODULE_SWITCH (0x804D)
  23. #define JT9261T_REG_CONFIG_CHKSUM (0x80FF)
  24. #define JT9261T_REG_CONFIG_FRESH (0x8100)
  25. #define JT9261T_POINT_INFO_NUM (6)
  26. #define JT9261T_TOUCH_NUMBER_MIN (1)
  27. #define JT9261T_TOUCH_NUMBER_MAX (10)
  28. #define JT9261T_REFRESH_RATE_MIN (5)
  29. #define JT9261T_REFRESH_RATE_MAX (20)
  30. typedef struct{
  31. uint8_t x_h;
  32. uint8_t x_l;
  33. uint8_t y_h;
  34. uint8_t y_l;
  35. uint8_t w;
  36. uint8_t reserved;
  37. }luat_tp_touch_t;
  38. typedef struct luat_touch_info{
  39. uint8_t touch_num;
  40. uint8_t reserved0;
  41. uint8_t reserved1;
  42. luat_tp_touch_t point[JT9261T_TOUCH_NUMBER_MAX];
  43. }luat_tp_info_t;
  44. static uint8_t jd9261t_init_state = 0;
  45. /* 根据官方推荐,优先使用后门方式,自动识别,如不支持自动切换至非后门 */
  46. static uint8_t jd9261t_back_door_mode = 1;
  47. static inline int jd9261t_Read_BackDoor_RegSingle(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *rdata){
  48. uint8_t addrBuf[] = {
  49. 0xF3,
  50. (uint8_t)((addr & 0xFF000000) >> 24),
  51. (uint8_t)((addr & 0x00FF0000) >> 16),
  52. (uint8_t)((addr & 0x0000FF00) >> 8),
  53. (uint8_t)((addr & 0x000000FF) >> 0),
  54. 0x03,
  55. };
  56. return tp_i2c_read(luat_tp_config, addrBuf, sizeof(addrBuf), rdata, 1, 0);
  57. }
  58. static inline int jd9261t_Write_BackDoor_RegSingle(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t wdata){
  59. uint8_t addrBuf[] = {
  60. 0xF2,
  61. (uint8_t)((addr & 0xFF000000) >> 24),
  62. (uint8_t)((addr & 0x00FF0000) >> 16),
  63. (uint8_t)((addr & 0x0000FF00) >> 8),
  64. (uint8_t)((addr & 0x000000FF) >> 0),
  65. 0x03,
  66. };
  67. return tp_i2c_write(luat_tp_config, addrBuf, sizeof(addrBuf), (uint8_t[]){wdata}, 1);
  68. }
  69. static inline int jd9261t_Read_BackDoor_RegMulti(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *rdata, uint16_t rlen){
  70. uint8_t addrBuf[] = {
  71. 0xF3,
  72. (uint8_t)((addr & 0xFF000000) >> 24),
  73. (uint8_t)((addr & 0x00FF0000) >> 16),
  74. (uint8_t)((addr & 0x0000FF00) >> 8),
  75. (uint8_t)((addr & 0x000000FF) >> 0),
  76. 0x03,
  77. };
  78. return tp_i2c_read(luat_tp_config, addrBuf, sizeof(addrBuf), rdata, rlen, 0);
  79. }
  80. static inline int jd9261t_Write_BackDoor_RegMulti(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *wdata, uint16_t wlen){
  81. uint8_t addrBuf[] = {
  82. 0xF2,
  83. (uint8_t)((addr & 0xFF000000) >> 24),
  84. (uint8_t)((addr & 0x00FF0000) >> 16),
  85. (uint8_t)((addr & 0x0000FF00) >> 8),
  86. (uint8_t)((addr & 0x000000FF) >> 0),
  87. 0x03,
  88. };
  89. return tp_i2c_write(luat_tp_config, addrBuf, sizeof(addrBuf), wdata, wlen);
  90. }
  91. static int jd9261t_Read_FW_RegSingleI2c(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *rdata){
  92. uint8_t addrBuf[] = {
  93. (uint8_t)((addr & 0xFF000000) >> 24),
  94. (uint8_t)((addr & 0x00FF0000) >> 16),
  95. (uint8_t)((addr & 0x0000FF00) >> 8),
  96. (uint8_t)((addr & 0x000000FF) >> 0),
  97. 0x00,
  98. 0x01,
  99. };
  100. return tp_i2c_read(luat_tp_config, addrBuf, sizeof(addrBuf), rdata, 1, 0);
  101. }
  102. static int jd9261t_Write_FW_RegSingleI2c(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t wdata){
  103. uint8_t addrBuf[] = {
  104. (uint8_t)((addr & 0xFF000000) >> 24),
  105. (uint8_t)((addr & 0x00FF0000) >> 16),
  106. (uint8_t)((addr & 0x0000FF00) >> 8),
  107. (uint8_t)((addr & 0x000000FF) >> 0),
  108. 0x00,
  109. 0x01,
  110. };
  111. return tp_i2c_write(luat_tp_config, addrBuf, sizeof(addrBuf), (uint8_t[]){wdata}, 1);
  112. }
  113. static int jd9261t_Read_FW_RegMultiI2c(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *rdata, uint16_t rlen){
  114. uint8_t addrBuf[] = {
  115. (uint8_t)((addr & 0xFF000000) >> 24),
  116. (uint8_t)((addr & 0x00FF0000) >> 16),
  117. (uint8_t)((addr & 0x0000FF00) >> 8),
  118. (uint8_t)((addr & 0x000000FF) >> 0),
  119. (uint8_t)((rlen & 0xFF00) >> 8),
  120. (uint8_t)((rlen & 0x00FF) >> 0),
  121. };
  122. return tp_i2c_read(luat_tp_config, addrBuf, sizeof(addrBuf), rdata, rlen, 0);
  123. }
  124. static int jd9261t_Write_FW_RegMultiI2c(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *wdata, uint16_t wlen){
  125. uint8_t addrBuf[] = {
  126. (uint8_t)((addr & 0xFF000000) >> 24),
  127. (uint8_t)((addr & 0x00FF0000) >> 16),
  128. (uint8_t)((addr & 0x0000FF00) >> 8),
  129. (uint8_t)((addr & 0x000000FF) >> 0),
  130. (uint8_t)((wlen & 0xFF00) >> 8),
  131. (uint8_t)((wlen & 0x00FF) >> 0),
  132. };
  133. return tp_i2c_write(luat_tp_config, addrBuf, sizeof(addrBuf), wdata, wlen);
  134. }
  135. static inline int jd9261t_ReadRegSingle(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *rdata){
  136. if (jd9261t_back_door_mode){
  137. return jd9261t_Read_BackDoor_RegSingle(luat_tp_config, addr, rdata);
  138. } else {
  139. return jd9261t_Read_FW_RegSingleI2c(luat_tp_config, addr, rdata);
  140. }
  141. }
  142. static inline int jd9261t_WriteRegSingle(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t wdata){
  143. if (jd9261t_back_door_mode){
  144. return jd9261t_Write_BackDoor_RegSingle(luat_tp_config, addr, wdata);
  145. } else {
  146. return jd9261t_Write_FW_RegSingleI2c(luat_tp_config, addr, wdata);
  147. }
  148. }
  149. static inline int jd9261t_ReadRegMulti(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *rdata, uint16_t rlen){
  150. if (jd9261t_back_door_mode){
  151. return jd9261t_Read_BackDoor_RegMulti(luat_tp_config, addr, rdata, rlen);
  152. } else {
  153. return jd9261t_Read_FW_RegMultiI2c(luat_tp_config, addr, rdata, rlen);
  154. }
  155. }
  156. static inline int jd9261t_WriteRegMulti(luat_tp_config_t* luat_tp_config, uint32_t addr, uint8_t *wdata, uint16_t wlen){
  157. if (jd9261t_back_door_mode){
  158. return jd9261t_Write_BackDoor_RegMulti(luat_tp_config, addr, wdata, wlen);
  159. } else {
  160. return jd9261t_Write_FW_RegMultiI2c(luat_tp_config, addr, wdata, wlen);
  161. }
  162. }
  163. static inline int jd9261t_EnterBackDoor(luat_tp_config_t* luat_tp_config){
  164. uint8_t addrBuf[] = {
  165. 0xF2,
  166. 0xAA,
  167. 0xF0,
  168. 0x0F,
  169. 0x55,
  170. };
  171. return tp_i2c_write(luat_tp_config, addrBuf, sizeof(addrBuf), (uint8_t[]){0x68}, 1);
  172. }
  173. static inline int jd9261t_ExitBackDoor(luat_tp_config_t* luat_tp_config){
  174. uint8_t addrBuf[] = {
  175. 0xF2,
  176. 0xAA,
  177. 0x88,
  178. 0x00,
  179. 0x00,
  180. };
  181. return tp_i2c_write(luat_tp_config, addrBuf, sizeof(addrBuf), (uint8_t[]){0x00}, 1);
  182. }
  183. // static int jd9261t_obtain_config(luat_tp_config_t* luat_tp_config, uint8_t *config, uint8_t size){
  184. // if (tp_i2c_read_reg16(luat_tp_config, JT9261T_CONFIG_REG, config, size, 1)){
  185. // LLOGE("obtain config regs fail!");
  186. // return -1;
  187. // }
  188. // uint8_t check_sum = 0;
  189. // for (uint8_t index=0; index<size-2; index++){
  190. // check_sum += config[index];
  191. // }
  192. // check_sum = (~check_sum) + 1;
  193. // if (config[JT9261T_CHECK_SUM - JT9261T_CONFIG_REG] != check_sum){
  194. // LLOGE("check sum 0X%02x and 0X%02x is not equal!", config[JT9261T_CHECK_SUM - JT9261T_CONFIG_REG], check_sum);
  195. // return -1;
  196. // }
  197. // return 0;
  198. // }
  199. // static int jd9261t_update_config(luat_tp_config_t* luat_tp_config, uint8_t *config, uint8_t size){
  200. // uint8_t check_sum = 0;
  201. // for (uint8_t index=0; index<size-2; index++){
  202. // check_sum += config[index];
  203. // }
  204. // check_sum = (~check_sum) + 1;
  205. // config[JT9261T_CHECK_SUM - JT9261T_CONFIG_REG] = check_sum;
  206. // config[JT9261T_CONFIG_FRESH - JT9261T_CONFIG_REG] = 1;
  207. // if (tp_i2c_write_reg16(luat_tp_config, JT9261T_CONFIG_REG, config, size)){
  208. // LLOGE("write config regs fail!");
  209. // return -1;
  210. // }
  211. // return 0;
  212. // }
  213. static inline int tp_jd9261t_soft_reset(luat_tp_config_t* luat_tp_config){
  214. return tp_i2c_write_reg32(luat_tp_config, JT9261T_REG_RESET, (uint8_t[]){JT9261T_CMD_RESET}, 1);
  215. }
  216. static int tp_jd9261t_detect(luat_tp_config_t* luat_tp_config){
  217. uint16_t product_id = 0;
  218. luat_tp_config->address = JT9261T_ADDRESS0;
  219. if (jd9261t_back_door_mode){
  220. jd9261t_EnterBackDoor(luat_tp_config); /* EnterBackDoor */
  221. }
  222. jd9261t_ReadRegMulti(luat_tp_config, JT9261T_PRODUCT_ID, &product_id, sizeof(product_id));
  223. if (product_id == JT9261T_PRODUCT_ID_CODE){
  224. LLOGI("TP find device JT9261T ,address:0x%02X",luat_tp_config->address);
  225. return 0;
  226. }else{
  227. luat_tp_config->address = JT9261T_ADDRESS1;
  228. if (jd9261t_back_door_mode){
  229. jd9261t_EnterBackDoor(luat_tp_config); /* EnterBackDoor */
  230. }
  231. jd9261t_ReadRegMulti(luat_tp_config, JT9261T_PRODUCT_ID, &product_id, sizeof(product_id));
  232. if (product_id == JT9261T_PRODUCT_ID_CODE){
  233. LLOGI("TP find device JT9261T ,address:0x%02X",luat_tp_config->address);
  234. return 0;
  235. }else{
  236. return -1;
  237. }
  238. }
  239. }
  240. static int luat_tp_irq_cb(int pin, void *args){
  241. if (jd9261t_init_state == 0){
  242. return -1;
  243. }
  244. luat_tp_config_t* luat_tp_config = (luat_tp_config_t*)args;
  245. luat_tp_irq_enable(luat_tp_config, 0);
  246. luat_rtos_message_send(luat_tp_config->task_handle, 1, args);
  247. return 0;
  248. }
  249. static inline int tp_jd9261t_gpio_init(luat_tp_config_t* luat_tp_config){
  250. if (luat_tp_config->pin_rst != LUAT_GPIO_NONE){
  251. luat_gpio_mode(luat_tp_config->pin_rst, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_LOW);
  252. luat_gpio_set(luat_tp_config->pin_rst, Luat_GPIO_LOW);
  253. }
  254. if (luat_tp_config->pin_int != LUAT_GPIO_NONE){
  255. luat_gpio_mode(luat_tp_config->pin_int, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, Luat_GPIO_LOW);
  256. luat_gpio_set(luat_tp_config->pin_int, Luat_GPIO_LOW);
  257. }
  258. luat_gpio_set(luat_tp_config->pin_int, Luat_GPIO_HIGH);
  259. if (luat_tp_config->pin_rst != LUAT_GPIO_NONE){
  260. luat_rtos_task_sleep(5);
  261. luat_gpio_set(luat_tp_config->pin_rst, Luat_GPIO_HIGH);
  262. luat_rtos_task_sleep(5);
  263. luat_gpio_set(luat_tp_config->pin_rst, Luat_GPIO_LOW);
  264. luat_rtos_task_sleep(50);
  265. luat_gpio_set(luat_tp_config->pin_rst, Luat_GPIO_HIGH);
  266. luat_rtos_task_sleep(100);
  267. }
  268. return 0;
  269. }
  270. static int tp_jd9261t_init(luat_tp_config_t* luat_tp_config){
  271. int ret = 0;
  272. luat_rtos_task_sleep(100);
  273. tp_jd9261t_gpio_init(luat_tp_config);
  274. ret = tp_jd9261t_detect(luat_tp_config);
  275. if (ret){
  276. LLOGD("tp backdoor mode detect fail!");
  277. jd9261t_back_door_mode = 0;
  278. ret = tp_jd9261t_detect(luat_tp_config);
  279. if(ret){
  280. LLOGE("tp detect fail!");
  281. return ret;
  282. }
  283. }
  284. // uint8_t cfg_table[JT9261T_CONFIG_SIZE] = {0};
  285. // jd9261t_obtain_config(luat_tp_config, cfg_table, JT9261T_CONFIG_SIZE);
  286. // // renew config parameters.
  287. // memcpy((uint8_t*)(&cfg_table[JT9261T_X_OUTPUT_MAX - JT9261T_CONFIG_REG]), (uint8_t*)(&luat_tp_config->w), 2);
  288. // memcpy((uint8_t*)(&cfg_table[JT9261T_Y_OUTPUT_MAX - JT9261T_CONFIG_REG]), (uint8_t*)(&luat_tp_config->h), 2);
  289. // if (LUAT_GPIO_RISING_IRQ == luat_tp_config->int_type){
  290. // cfg_table[JT9261T_MODULE_SWITCH1 - JT9261T_CONFIG_REG] &= 0xFC;
  291. // cfg_table[JT9261T_MODULE_SWITCH1 - JT9261T_CONFIG_REG] |= 0x00;
  292. // }else if (LUAT_GPIO_FALLING_IRQ == luat_tp_config->int_type){
  293. // cfg_table[JT9261T_MODULE_SWITCH1 - JT9261T_CONFIG_REG] &= 0xFC;
  294. // cfg_table[JT9261T_MODULE_SWITCH1 - JT9261T_CONFIG_REG] |= 0x01;
  295. // }
  296. // // xy cordinate swap.
  297. // if (luat_tp_config->swap_xy){
  298. // cfg_table[JT9261T_MODULE_SWITCH1 - JT9261T_CONFIG_REG] &= 0xF7;
  299. // cfg_table[JT9261T_MODULE_SWITCH1 - JT9261T_CONFIG_REG] |= 0x08;
  300. // }
  301. // // refresh rate.
  302. // if (luat_tp_config->refresh_rate > JT9261T_REFRESH_RATE_MAX || luat_tp_config->refresh_rate == 0){
  303. // cfg_table[JT9261T_REFRESH_RATE - JT9261T_CONFIG_REG] = JT9261T_REFRESH_RATE_MAX;
  304. // }else if (luat_tp_config->refresh_rate < JT9261T_REFRESH_RATE_MIN){
  305. // cfg_table[JT9261T_REFRESH_RATE - JT9261T_CONFIG_REG] = JT9261T_REFRESH_RATE_MIN;
  306. // }else{
  307. // cfg_table[JT9261T_REFRESH_RATE - JT9261T_CONFIG_REG] = luat_tp_config->refresh_rate - JT9261T_REFRESH_RATE_MIN;
  308. // }
  309. // // touch number.
  310. // if (luat_tp_config->tp_num > JT9261T_TOUCH_NUMBER_MAX || luat_tp_config->tp_num == 0){
  311. // cfg_table[JT9261T_TOUCH_NUMBER - JT9261T_CONFIG_REG] = JT9261T_TOUCH_NUMBER_MAX;
  312. // }else if (luat_tp_config->tp_num < JT9261T_TOUCH_NUMBER_MIN){
  313. // cfg_table[JT9261T_TOUCH_NUMBER - JT9261T_CONFIG_REG] = JT9261T_TOUCH_NUMBER_MIN;
  314. // }else{
  315. // cfg_table[JT9261T_TOUCH_NUMBER - JT9261T_CONFIG_REG] = luat_tp_config->tp_num;
  316. // }
  317. // jd9261t_update_config(luat_tp_config, cfg_table, JT9261T_CONFIG_SIZE);
  318. // // jd9261t_update_config(luat_tp_config, jd9261t_cfg_table, JT9261T_CONFIG_SIZE);
  319. // // luat_rtos_task_sleep(5);
  320. // // tp_jd9261t_soft_reset(luat_tp_config);
  321. // luat_rtos_task_sleep(20);
  322. // // tp_i2c_write_reg16(luat_tp_config, JT9261T_COMMAND_REG, (uint8_t[]){0x00}, 1);
  323. if (luat_tp_config->pin_int != LUAT_GPIO_NONE){
  324. luat_gpio_t gpio = {0};
  325. gpio.pin = luat_tp_config->pin_int;
  326. gpio.mode = Luat_GPIO_IRQ;
  327. gpio.pull = Luat_GPIO_DEFAULT;
  328. gpio.irq = LUAT_GPIO_FALLING_IRQ;
  329. gpio.irq_cb = luat_tp_irq_cb;
  330. gpio.irq_args = luat_tp_config;
  331. luat_gpio_setup(&gpio);
  332. }
  333. jd9261t_init_state = 1;
  334. return ret;
  335. }
  336. static int tp_jd9261t_deinit(luat_tp_config_t* luat_tp_config){
  337. jd9261t_init_state = 0;
  338. if (luat_tp_config->pin_int != LUAT_GPIO_NONE){
  339. luat_gpio_close(luat_tp_config->pin_int);
  340. }
  341. if (luat_tp_config->pin_rst != LUAT_GPIO_NONE){
  342. luat_gpio_close(luat_tp_config->pin_rst);
  343. }
  344. return 0;
  345. }
  346. static void tp_jd9261t_read_done(luat_tp_config_t * luat_tp_config){
  347. if (luat_gpio_get(luat_tp_config->pin_int)){
  348. luat_tp_irq_enable(luat_tp_config, 1);
  349. }else{
  350. luat_rtos_message_send(luat_tp_config->task_handle, 1, luat_tp_config);
  351. }
  352. }
  353. // jd9261t get tp info.
  354. static int16_t pre_x[JT9261T_TOUCH_NUMBER_MAX] = {-1, -1, -1, -1, -1};
  355. static int16_t pre_y[JT9261T_TOUCH_NUMBER_MAX] = {-1, -1, -1, -1, -1};
  356. static int16_t pre_w[JT9261T_TOUCH_NUMBER_MAX] = {-1, -1, -1, -1, -1};
  357. static uint8_t s_tp_down[JT9261T_TOUCH_NUMBER_MAX];
  358. // static uint8_t read_buff[JT9261T_POINT_INFO_NUM * JT9261T_TOUCH_NUMBER_MAX];
  359. static luat_tp_info_t luat_touch_info = {0};
  360. void jd9261t_touch_up(void *buf, int8_t id){
  361. luat_tp_data_t *read_data = (luat_tp_data_t *)buf;
  362. if(s_tp_down[id] == 1){
  363. s_tp_down[id] = 0;
  364. read_data[id].event = TP_EVENT_TYPE_UP;
  365. }else{
  366. read_data[id].event = TP_EVENT_TYPE_NONE;
  367. }
  368. read_data[id].timestamp = luat_mcu_ticks();
  369. read_data[id].width = pre_w[id];
  370. read_data[id].x_coordinate = pre_x[id];
  371. read_data[id].y_coordinate = pre_y[id];
  372. read_data[id].track_id = id;
  373. pre_x[id] = -1; /* last point is none */
  374. pre_y[id] = -1;
  375. pre_w[id] = -1;
  376. }
  377. void jd9261t_touch_down(void *buf, int8_t id, int16_t x, int16_t y, int16_t w){
  378. luat_tp_data_t *read_data = (luat_tp_data_t *)buf;
  379. if (s_tp_down[id] == 1){
  380. read_data[id].event = TP_EVENT_TYPE_MOVE;
  381. }else{
  382. read_data[id].event = TP_EVENT_TYPE_DOWN;
  383. s_tp_down[id] = 1;
  384. }
  385. read_data[id].timestamp = luat_mcu_ticks();
  386. read_data[id].width = w;
  387. read_data[id].x_coordinate = x;
  388. read_data[id].y_coordinate = y;
  389. read_data[id].track_id = id;
  390. pre_x[id] = x; /* save last point */
  391. pre_y[id] = y;
  392. pre_w[id] = w;
  393. }
  394. void jd9261t_read_point(luat_tp_config_t* luat_tp_config, luat_tp_touch_t *input_buff, void *buf, uint8_t touch_num){
  395. luat_tp_touch_t *read_buf = input_buff;
  396. uint8_t read_index;
  397. int8_t read_id = 0;
  398. int16_t input_x = 0;
  399. int16_t input_y = 0;
  400. int16_t input_w = 0;
  401. static uint8_t pre_touch = 0;
  402. static int8_t pre_id[JT9261T_TOUCH_NUMBER_MAX] = {0};
  403. if (pre_touch > touch_num){ /* point up */
  404. for (read_index = 0; read_index < pre_touch; read_index++){
  405. uint8_t j;
  406. for (j = 0; j < touch_num; j++){ /* this time touch num */
  407. read_id = j;
  408. if (pre_id[read_index] == read_id) /* this id is not free */
  409. break;
  410. if (j >= touch_num - 1){
  411. uint8_t up_id;
  412. up_id = pre_id[read_index];
  413. jd9261t_touch_up(buf, up_id);
  414. }
  415. }
  416. }
  417. }
  418. if (touch_num){ /* point down */
  419. uint8_t off_set;
  420. for (read_index = 0; read_index < touch_num; read_index++){
  421. pre_id[read_index] = read_index;
  422. input_x = read_buf[read_index].x_h<<8 | read_buf[read_index].x_l; /* x */
  423. input_y = read_buf[read_index].y_h<<8 | read_buf[read_index].y_l; /* y */
  424. if (input_x>luat_tp_config->w || input_y>luat_tp_config->h){
  425. return;
  426. }
  427. input_w = read_buf[read_index].w; /* w */
  428. jd9261t_touch_down(buf, read_index, input_x, input_y, input_w);
  429. }
  430. }else if (pre_touch){
  431. for(read_index = 0; read_index < pre_touch; read_index++){
  432. jd9261t_touch_up(buf, pre_id[read_index]);
  433. }
  434. }
  435. pre_touch = touch_num;
  436. }
  437. static int tp_jd9261t_read(luat_tp_config_t* luat_tp_config, luat_tp_data_t *luat_tp_data){
  438. uint8_t touch_num=0, point_status=0;
  439. jd9261t_ReadRegMulti(luat_tp_config, JT9261T_READ_COOR_ADDR, (uint8_t *)&luat_touch_info, sizeof(luat_touch_info));
  440. touch_num = luat_touch_info.touch_num;
  441. jd9261t_read_point(luat_tp_config, luat_touch_info.point, luat_tp_data, luat_touch_info.touch_num);
  442. return touch_num;
  443. }
  444. luat_tp_opts_t tp_config_jd9261t = {
  445. .name = "jd9261t",
  446. .init = tp_jd9261t_init,
  447. .deinit = tp_jd9261t_deinit,
  448. .read = tp_jd9261t_read,
  449. .read_done = tp_jd9261t_read_done,
  450. };