GoodixTouch.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : IIC.c
  3. * Author : WCH
  4. * Version : V1.0
  5. * Date : 2018/12/12
  6. * Description : I2C 读写
  7. *******************************************************************************/
  8. /*********************************************************************
  9. * INCLUDES
  10. */
  11. #include "include.h"
  12. #define READ_TOUCH_POS_EVT 0x0001
  13. #define READ_RESET_TOUCH_IC_EVT 0x0002
  14. #define SYS_INIT_FINISH_EVT 0x0004
  15. #define RELEASE_TOUCH_EVT 0x0008
  16. #define READ_ONE_POINT_EVT 0x0010
  17. #define START_REPORT_POS_EVT 0x0020
  18. #define CHECK_TOUCH_INT_EVT 0x0040
  19. #define REPORT_AGAIN_EVT 0x0080
  20. #define CHECK_ESD_EVT 0x0100
  21. #define HID_DEBUG_EVT 0x0200
  22. #define CHECK_USB_STATUS_EVT 0x0400
  23. #define PERIO_1s 1600
  24. #define PERIO_2s (PERIO_1s*2)
  25. #define PERIO_5s (PERIO_1s*5)
  26. #define PERIO_40s (PERIO_1s*40)
  27. static UINT8 IICTouchTaskId = INVALID_TASK_ID;
  28. static UINT8 PointNum = 0;
  29. static UINT8 ReadPointCnt = 0;
  30. static BOOL ReportPosSuccess = TRUE;
  31. static void ReadOnePoint(void);
  32. //static void CheckTouchINT(void);
  33. static void StartReportPos(void);
  34. static void ReportPos(void);
  35. static UINT16 IICTouch_ProcessEvent( UINT8 task_id, UINT16 events );
  36. static void CheckTouchChipType();
  37. static void CheckTouchINT(void);
  38. #ifdef MOUSE_REPORT
  39. #ifndef GESTURE
  40. extern UINT8 mouse_right_click_time;
  41. #endif
  42. #ifndef GESTURE
  43. extern void ReportMousePos(POINTER * pTP);
  44. #else
  45. void ReportMousePos(POINTER * pTP, UINT8 interface);
  46. #endif
  47. static BOOL StylusFlag;
  48. #endif
  49. static BOOL SysInitFinish = FALSE;
  50. //BOOL GT_Check_I2C_Address()
  51. //{
  52. // BOOL bRet;
  53. //
  54. // IIC_Start();
  55. //
  56. // bRet = IIC_Send_Byte(GT_CMD_WR); //发送写命令
  57. //
  58. // IIC_Stop();
  59. //
  60. // return bRet;
  61. //}
  62. static void ShutdownHIDI2C()
  63. {
  64. IICWriteBytes( 0x8000, ShareBuf + 1, 1);
  65. ShareBuf[0]=0xAA;
  66. ShareBuf[1]=0;
  67. ShareBuf[2]=0x56;
  68. IICWriteBytes( 0x8041, ShareBuf + 1, 2);
  69. IICWriteBytes( 0x8040, ShareBuf, 1);//关闭HID-I2C功能
  70. IICWriteBytes( 0x824E, ShareBuf + 1, 1);
  71. }
  72. /*******************************************************************************
  73. * Function Name : GT_Init
  74. * Description : 触摸板初始化,获取ID,确认是否工作
  75. * Input : None
  76. * Output : None
  77. * Return : None
  78. *******************************************************************************/
  79. void GT_Init(void)
  80. {
  81. //TouchProc = CheckTouchINT;
  82. //CheckPos = MAX_POINT;
  83. CheckTouchChipType();
  84. if(ChipType == CHIP_TYPE_73XX)//新版7387必须要先关掉hid才能读取版本号
  85. {
  86. delay_ms(500);
  87. ShutdownHIDI2C();
  88. delay_ms(40);
  89. ShutdownHIDI2C();
  90. delay_ms(40);
  91. ShutdownHIDI2C();
  92. }
  93. if(ChipType == CHIP_TYPE_9XXX || ChipType == CHIP_TYPE_9PXX)
  94. {
  95. gpio_reset_bits(GPIOA_REG, INT_PIN);
  96. gpio_set_out(GPIOA_REG, INT_PIN);
  97. delay_ms(60);//RST
  98. gpio_set_input(GPIOA_REG, INT_PIN);
  99. }
  100. if (IICTouchTaskId == INVALID_TASK_ID)
  101. {
  102. IICTouchTaskId = TMOS_ProcessEventRegister(IICTouch_ProcessEvent);
  103. tmos_set_event(IICTouchTaskId, HID_DEBUG_EVT);
  104. }
  105. //
  106. //PRINT("enable esd check\n");
  107. tmos_start_task(IICTouchTaskId, CHECK_ESD_EVT, PERIO_2s );
  108. tmos_start_task(IICTouchTaskId, SYS_INIT_FINISH_EVT, PERIO_40s );
  109. }
  110. void GT_Check_ESD()
  111. {
  112. UINT8 tmp;
  113. if(!enable_ESD_check) return;
  114. if (!IICReadBytes(0x8044, &tmp, 1) || tmp == 0x03)
  115. {
  116. PRINT("GT Check ESD Error!\n");
  117. ResetTouchChip();
  118. return;
  119. }
  120. else if(!IICReadBytes(0x8040,&tmp,1) || tmp == 0xAA)
  121. {
  122. PRINT("GT Check ESD Error!\n");
  123. ResetTouchChip(); //Rstart touch ic
  124. return;
  125. }
  126. else
  127. {
  128. tmp = 0xAA;
  129. IICWriteOneByte(0x8040,tmp);
  130. }
  131. }
  132. static void CheckTouchChipType()
  133. {
  134. UINT8 i;
  135. UINT8 pid[8];
  136. for(i=0; i<10; i++)
  137. {
  138. if(IICReadBytes(0x8240, pid, 4))
  139. {
  140. if((pid[0] == '7'&& pid[1] == '3'&& pid[2] == '8' && pid[3] == '8')
  141. || (pid[0] == '7'&& pid[1] == '3'&& pid[2] == '8' && pid[3] == '7')
  142. )
  143. {
  144. ChipType = CHIP_TYPE_73XX;
  145. break;
  146. }
  147. }
  148. if(IICReadBytes(0x8140, pid, 4))
  149. {
  150. if((pid[0] == '9'&& pid[1] == '1'&& pid[2] == '1'))
  151. {
  152. ChipType = CHIP_TYPE_9XXX;
  153. break;
  154. }
  155. else if((pid[0] == '7'&& pid[1] == '2'&& pid[2] == '8' && pid[3] == '8')
  156. || (pid[0] == '9'&& pid[1] == '2'&& pid[2] == '8' && pid[3] == '6')
  157. )
  158. {
  159. ChipType = CHIP_TYPE_9XXX;
  160. break;
  161. }
  162. }
  163. }
  164. if(i==10)
  165. {
  166. PRINT("Chip type unknow\n");
  167. if(IsBerlinChipType(ChipType))
  168. {
  169. ChipType = CHIP_TYPE_9XXX;
  170. }
  171. }
  172. }
  173. static void ClearTouchFlag()
  174. {
  175. UINT16 addr;
  176. if(ChipType == CHIP_TYPE_73XX)
  177. {
  178. addr = 0x824e;
  179. }
  180. else
  181. {
  182. addr = 0x814e;
  183. }
  184. #ifdef CHIP_TYPE_GT738X
  185. if(!IsDebugMode)
  186. #else
  187. if(!IsDebugMode)
  188. #endif
  189. {
  190. UINT8 temp = 0;
  191. IICWriteBytes(addr,&temp,1); //清标志
  192. }
  193. }
  194. void GT_SetTouchEvent()
  195. {
  196. tmos_set_event(IICTouchTaskId, CHECK_TOUCH_INT_EVT);
  197. }
  198. //
  199. static UINT16 IICTouch_ProcessEvent( UINT8 task_id, UINT16 events )
  200. {
  201. //BOOL bSuccess = TRUE;;
  202. if(events & REPORT_AGAIN_EVT)
  203. {
  204. ReportPos();
  205. events ^= REPORT_AGAIN_EVT;
  206. goto OUT_FUMC;
  207. }
  208. if(events & START_REPORT_POS_EVT)
  209. {
  210. //PRINT("SR");
  211. StartReportPos();
  212. events ^= START_REPORT_POS_EVT;
  213. goto OUT_FUMC;
  214. }
  215. if(events & READ_ONE_POINT_EVT)
  216. {
  217. ReadOnePoint();
  218. events ^= READ_ONE_POINT_EVT;
  219. //有中断,取消USB检测
  220. events &= ~CHECK_USB_STATUS_EVT;
  221. tmos_stop_task(IICTouchTaskId, CHECK_USB_STATUS_EVT);
  222. goto OUT_FUMC;
  223. }
  224. if(events & CHECK_TOUCH_INT_EVT)
  225. {
  226. //PRINT("TI");
  227. CheckTouchINT();
  228. events ^= CHECK_TOUCH_INT_EVT;
  229. if(PointNum == 0 && SysInitFinish) //松键
  230. {
  231. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s ); //1s后开启USB检测
  232. }
  233. goto OUT_FUMC;
  234. }
  235. if(events & CHECK_ESD_EVT)
  236. {
  237. //PRINT("esd check\n");
  238. GT_Check_ESD();
  239. events ^= CHECK_ESD_EVT;
  240. //PRINT("enable esd check\n");
  241. tmos_start_task(IICTouchTaskId, CHECK_ESD_EVT, PERIO_2s );
  242. goto OUT_FUMC;
  243. }
  244. if(events & SYS_INIT_FINISH_EVT)
  245. {
  246. SysInitFinish = TRUE;
  247. events ^= SYS_INIT_FINISH_EVT;
  248. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s);
  249. goto OUT_FUMC;
  250. }
  251. if(events & CHECK_USB_STATUS_EVT)
  252. {
  253. events ^= CHECK_USB_STATUS_EVT;
  254. if(CheckUsbStatus())
  255. {
  256. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_5s );//避免系统重连慢造成反复复位重连
  257. }
  258. else {
  259. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s );
  260. }
  261. goto OUT_FUMC;
  262. }
  263. // if(events & HID_DEBUG_EVT)
  264. // {
  265. // CommandHandle();
  266. // events ^= HID_DEBUG_EVT;
  267. // tmos_set_event(task_id, HID_DEBUG_EVT);
  268. // goto OUT_FUMC;
  269. // }
  270. return 0;
  271. OUT_FUMC:
  272. return events;
  273. }
  274. //
  275. //
  276. static void CheckTouchINT(void)
  277. {
  278. UINT8 point_num;
  279. UINT16 addr;
  280. if(ChipType == CHIP_TYPE_73XX)
  281. {
  282. addr = 0x824e;
  283. }
  284. else
  285. {
  286. addr = 0x814e;
  287. }
  288. IICReadBytes(addr,&point_num,1); //读取触摸点的状态
  289. #ifdef CHIP_TYPE_GT738X
  290. if((( point_num & BIT7 ) == 0 || (point_num & 0x0F)> MAX_POINT) && !ReleaseFlag) /* 正常不会执行这个的,表示GT芯片是否准备好 */
  291. #else
  292. if((( point_num & BIT7 ) == 0 || (point_num & 0x0F)> MAX_POINT)) /* 正常不会执行这个的,表示GT芯片是否准备好 */
  293. #endif
  294. {
  295. point_num = 0;
  296. IICWriteBytes(addr,&point_num,1); //清标志,如果延迟较长可以去掉
  297. return;
  298. }
  299. #ifdef MOUSE_REPORT
  300. StylusFlag = FALSE;
  301. #endif
  302. NoTouchTimer = 0;
  303. PointNum = point_num & 0x0F;
  304. ReadPointCnt = 0;
  305. OutRangeFlag = 0xFFFF;
  306. Press_Flag = 0;
  307. // if(PointNum==0)
  308. // {
  309. // StartReportPos();
  310. // }
  311. // else
  312. // {
  313. // ReadOnePoint();
  314. // }
  315. if(PointNum==0)
  316. {
  317. tmos_set_event(IICTouchTaskId, START_REPORT_POS_EVT);
  318. }
  319. else
  320. {
  321. tmos_set_event(IICTouchTaskId, READ_ONE_POINT_EVT);
  322. }
  323. }
  324. //__attribute__((section(".highcode")))
  325. static void ReadOnePoint()
  326. {
  327. UINT8 buf[13];
  328. UINT8 index;
  329. UINT16 tmp;
  330. //UINT8 tmp8;
  331. UINT16 reg_addr = GT_POINT_BASE_ADDR + ReadPointCnt * 8;
  332. if(ChipType == CHIP_TYPE_73XX)
  333. {
  334. reg_addr = 0x824F + ReadPointCnt * 8;
  335. }
  336. else
  337. {
  338. reg_addr = 0x814F + ReadPointCnt * 8;
  339. }
  340. IICReadBytes( reg_addr, buf, 7 );
  341. #ifdef STYLUS_REPORT
  342. if(buf[0]&0x80)
  343. {
  344. GT_RD_Reg(GT_GSTID_REG + (PointNum << 3) ,buf+7,6); //stylus keY
  345. StylusPress = ((UINT16)buf[6]<<8)+buf[5] ; //stylus pressure
  346. StylusFlag = TRUE;
  347. if((DeviceMode!=DEVICE_MODE_MOUSE) && (!UartReportPosEn))
  348. {
  349. Press_Flag = (((UINT16)buf[12] & 0xFC) << 8) | 0x8000;
  350. buf[0] =9;//&= 0x7F;
  351. index = 9;
  352. }
  353. else
  354. {
  355. if(StylusPress==0)
  356. goto OUT_FUNC;
  357. ShareBuf[0] =0;
  358. index = 0;
  359. }
  360. }
  361. else
  362. #endif
  363. {//查找和上次相同Press_Flag的索引位置
  364. for(index=0; index<10; index++)
  365. {
  366. if(((Press_Flag_Bak0 & (1L<<index))!= 0) && TP[ index ].Contact_Identifier == buf[0])
  367. {
  368. break; //
  369. }
  370. }
  371. if(index>=10)//没有找到配对位置,找一个空位
  372. {
  373. for(index=0; index<10; index++)
  374. {
  375. if(((Press_Flag_Bak0 | Press_Flag ) & (1L<<index)) == 0)
  376. {
  377. break; //
  378. }
  379. }
  380. }
  381. }
  382. if(index>=10) goto OUT_FUNC; //没有空位
  383. if((Press_Flag & 0x8000) && buf[0] == 9) //stylus Press_Flag
  384. {
  385. #ifdef STYLUS_TILT
  386. StylusTiltX = ((UINT16)buf[8]<<8)+buf[7] ;
  387. StylusTiltY = ((UINT16)buf[10]<<8)+buf[9] ;
  388. #endif
  389. }
  390. else
  391. {
  392. tmp = ((UINT16)buf[6]<<8)+buf[5];
  393. if(tmp==0)
  394. {
  395. goto OUT_FUNC;
  396. }
  397. }
  398. #ifdef AUTO_ADJUST_SOLUTION
  399. if(bSolutionValid)
  400. {
  401. TP[index].X_pos = (UINT32)(((UINT16)buf[2]<<8)+buf[1] ) * (RESOLUTION_X-1) / wMaxX;
  402. TP[index].Y_pos = (UINT32)(((UINT16)buf[4]<<8)+buf[3] ) * (RESOLUTION_Y-1) / wMaxY;
  403. }
  404. else
  405. #else
  406. {
  407. TP[index].X_pos = ( ((UINT16)buf[2]<<8)+buf[1] );
  408. TP[index].Y_pos = ( ((UINT16)buf[4]<<8)+buf[3] );
  409. }
  410. #endif
  411. TP[index].X_pos_back = TP[index].X_pos;
  412. TP[index].Y_pos_back = TP[index].Y_pos;
  413. #ifdef NEW_REVOLVE_PROTOCAL
  414. if (PosConvert(TP, index) == FALSE) //超出黑边的坐标返回FALSE,裁剪掉
  415. goto OUT_FUNC;
  416. #endif
  417. TP[ index ].Tip_Switch = 1;
  418. Press_Flag |= ((UINT16)1<<index);
  419. TP[ index ].Contact_Identifier = buf[0];
  420. OUT_FUNC:
  421. ReadPointCnt++;
  422. if(ReadPointCnt >= PointNum)
  423. {
  424. tmos_set_event(IICTouchTaskId, START_REPORT_POS_EVT);
  425. //StartReportPos();
  426. }
  427. else
  428. {
  429. //ReadOnePoint();
  430. tmos_set_event(IICTouchTaskId, READ_ONE_POINT_EVT);
  431. }
  432. }
  433. __attribute__((section(".highcode")))
  434. void StartReportPos()
  435. {
  436. TouchNum = 0;
  437. for(UINT8 i=0; i<MAX_POINT; i++)
  438. {
  439. if((Press_Flag & (((UINT16)1)<<i)) == 0)
  440. {
  441. TP[i].Tip_Switch = 0;
  442. }
  443. else
  444. {
  445. TouchNum++;
  446. }
  447. }
  448. #ifdef DOUBLECLIK_FILETER
  449. if(TouchNum <= 1) //&& (DeviceMode == DEVICE_MODE_MOUSE))
  450. {
  451. DoubleClickFilter(StylusFlag, 0);
  452. }
  453. else
  454. {
  455. DoubleClickTimer = 100;
  456. }
  457. #endif
  458. Press_Flag &= OutRangeFlag;
  459. Press_Flag_Bak0 = Press_Flag;
  460. Press_Flag |= Press_Flag_Bak1|Press_Flag_Bak2;//|Press_Flag_Bak3;
  461. #ifdef CALL_OSD_MENU
  462. CallOSDMenu(); //双指在右下角下滑,串口上报命令调用OSD菜单
  463. #endif
  464. #ifdef GESTURE
  465. if ( DeviceMode == DEVICE_MODE_MOUSE )
  466. {
  467. WheelMove();
  468. if (TwoPointsClick() == 1)
  469. {
  470. bclickFlag = 1;
  471. }
  472. }
  473. #endif
  474. ReportPos();
  475. }
  476. //__attribute__((section(".highcode")))
  477. static void ReportPos()
  478. {
  479. //static UINT8 nUSBFailedTimes = 0;
  480. ReportPosSuccess = TRUE;
  481. if (UsbReportPosEn || bTransmitEn)
  482. {
  483. if (bTransmitEn && !UsbReportPosEn)
  484. {
  485. #ifdef UART_ENABLE
  486. UartUpdatePos( &TP[0]);
  487. #endif
  488. Absolute_Up_Pack(TP);
  489. }
  490. else if(((DeviceMode == DEVICE_MODE_MULTITOUCH) && (config.report_type != EN_MOUSE_ONLY)) || (config.report_type == EN_MULTITOUCH_ONLY))
  491. {
  492. Absolute_Up_Pack(TP);
  493. }
  494. #ifdef MOUSE_REPORT
  495. else if(config.report_type != EN_MULTITOUCH_ONLY)
  496. {
  497. ReportMousePos(TP);
  498. }
  499. #endif
  500. }
  501. #ifdef UART_ENABLE
  502. //else if(UartReportPosEn)
  503. //{
  504. // UartUpdatePos( &TP[0]);
  505. //}
  506. #endif
  507. if(ReportPosSuccess)// || (EnumOK==FALSE && IsBLEConnected()==FALSE))
  508. {
  509. ClearTouchFlag();
  510. Press_Flag_Bak3 = Press_Flag_Bak2;
  511. Press_Flag_Bak2 = Press_Flag_Bak1;
  512. Press_Flag_Bak1 = Press_Flag_Bak0;
  513. //tmos_stop_task( IICTouchTaskId, REPORT_AGAIN_EVT );
  514. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s ); //1s后开启USB检测
  515. }
  516. else
  517. {
  518. //tmos_set_event(IICTouchTaskId, REPORT_AGAIN_EVT);
  519. //tmos_start_task(IICTouchTaskId, REPORT_AGAIN_EVT,3);
  520. //GPIOA_InverseBits(GPIO_Pin_2);
  521. }
  522. }
  523. /*********************************************************************
  524. *********************************************************************/