BerlinTouch.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  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 "typedef.h"
  12. #include "TouchInclude.h"
  13. #define READ_TOUCH_POS_EVT 0x0001
  14. #define READ_RESET_TOUCH_IC_EVT 0x0002
  15. #define SYS_INIT_FINISH_EVT 0x0004
  16. #define RELEASE_TOUCH_EVT 0x0008
  17. #define READ_ONE_POINT_EVT 0x0010
  18. #define START_REPORT_POS_EVT 0x0020
  19. #define CHECK_TOUCH_INT_EVT 0x0040
  20. #define REPORT_AGAIN_EVT 0x0080
  21. #define CHECK_ESD_EVT 0x0100
  22. #define HID_DEBUG_EVT 0x0200
  23. #define CHECK_USB_STATUS_EVT 0x0400
  24. #define PERIO_1s 1600
  25. #define PERIO_2s (PERIO_1s*2)
  26. #define PERIO_5s (PERIO_1s*5)
  27. #define PERIO_40s (PERIO_1s*40)
  28. #pragma pack(1)
  29. typedef struct
  30. {
  31. UINT8 Reserved0:3;
  32. UINT8 FPEvent:1;
  33. UINT8 HotknotEvent:1;
  34. UINT8 GestureEvent:1;
  35. UINT8 RequestEvent:1;
  36. UINT8 TouchEvent:1;
  37. UINT8 INTCounter;
  38. UINT8 TouchNum:4;
  39. UINT8 LargeTouch:1;
  40. UINT8 HoverApproachFlag:1;
  41. UINT8 EdgeFlag:1;
  42. UINT8 ReseINT:1;
  43. UINT8 CustomCoorInfoFlag:1;
  44. UINT8 StylusKey:3;
  45. UINT8 Reserved1:4;
  46. UINT8 StylusPower;
  47. UINT8 Reserved3;
  48. UINT16 CheckSum;
  49. }ST_EVENT_HEAD;
  50. #pragma pack(1)
  51. typedef struct{
  52. UINT8 rom_pid[6]; /* rom PID */
  53. UINT8 rom_vid[3]; /* Mask VID */
  54. UINT8 rom_vid_reserved;
  55. UINT8 patch_pid[8]; /* Patch PID */
  56. UINT8 patch_vid[4]; /* Patch VID */
  57. UINT8 patch_vid_reserved;
  58. UINT8 sensor_id;
  59. UINT8 reserved[2];
  60. UINT16 checksum;
  61. }ST_FW_VERSION;
  62. static UINT8 IICTouchTaskId = INVALID_TASK_ID;
  63. static UINT8 PointNum = 0;
  64. static UINT8 ReadPointCnt = 0;
  65. static BOOL ReportPosSuccess = TRUE;
  66. static void ReadOnePoint(void);
  67. static void CheckTouchINT(void);
  68. static void StartReportPos(void);
  69. static void ReportPos(void);
  70. static UINT16 IICTouch_ProcessEvent( UINT8 task_id, UINT16 events );
  71. static void BT_Check_ESD();
  72. #ifdef MOUSE_REPORT
  73. #ifndef GESTURE
  74. extern UINT8 mouse_right_click_time;
  75. #endif
  76. #ifndef GESTURE
  77. extern void ReportMousePos(POINTER * pTP);
  78. #else
  79. void ReportMousePos(POINTER * pTP, UINT8 interface);
  80. #endif
  81. BOOL StylusFlag;
  82. #endif
  83. static BOOL SysInitFinish = FALSE;
  84. extern BOOL SleepEn;
  85. /*******************************************************************************
  86. * Function Name : BT_WR_Reg
  87. * Description : 向GT911写入一次数据
  88. * Input : reg:起始寄存器地址
  89. buf:数据缓缓存区
  90. len:写数据长度
  91. * Output : None
  92. * Return : 0,成功;1,失败.
  93. *******************************************************************************/
  94. __attribute__((section(".highcode")))
  95. UINT8 BT_WR_Reg(UINT32 reg,UINT8 *buf,UINT8 len)
  96. {
  97. return IICWriteBytes(reg,buf,len);
  98. }
  99. ///*******************************************************************************
  100. //* Function Name : BT_RD_Reg
  101. //* Description : 从GT911读出一次数据
  102. //* Input : reg:起始寄存器地址
  103. // buf:数据缓缓存区
  104. // len:读数据长度
  105. //* Output : None
  106. //* Return : None
  107. //*******************************************************************************/
  108. //__attribute__((section(".highcode")))
  109. UINT8 BT_RD_Reg(UINT32 reg, UINT8 *buf,UINT8 len)
  110. {
  111. return IICReadBytes(reg, buf, len);
  112. }
  113. static void ShutdownHIDI2C()
  114. {
  115. UINT8 nTryTimes = 50;
  116. if(IICWriteOneByte(0x3030AABB, 0xCC))
  117. {
  118. delay_ms(80);
  119. while(nTryTimes--)
  120. {
  121. if(SearchAddress(100))
  122. break;
  123. delay_ms(10);
  124. }
  125. }
  126. }
  127. BOOL EntryUpdateMode()
  128. {
  129. UINT8 tryTimes = 3,i;
  130. UINT8 cmd[6] = {0x00,0x00,0x00,0x02,0x01,0x00};
  131. UINT32 state1,state2;
  132. gpio_reset_bits(GPIOA_REG, RST_PIN);
  133. delay_ms(20);//RST
  134. gpio_set_bits(GPIOA_REG, RST_PIN);
  135. delay_ms(15);//RST
  136. GioInterruptFlag = 0;
  137. if(!SearchAddress(100))
  138. {
  139. return FALSE;
  140. }
  141. while(tryTimes--)
  142. {
  143. IICWriteBytes(0x00000002, cmd + 4, 2);
  144. cmd[2] = 0x20;
  145. cmd[3] = 0x00;
  146. IICReadBytes(0x00002000, (UINT8*)&state1, 4);
  147. for(i=0; i<3; i++)
  148. {
  149. IICReadBytes(0x00002000, (UINT8*)&state2, 4);
  150. if(state1 != state2)
  151. {
  152. break;
  153. }
  154. }
  155. if(i==3) return TRUE;
  156. }
  157. return FALSE;
  158. }
  159. static void CheckTouchChipType(void)
  160. {
  161. UINT8 i;
  162. ST_FW_VERSION fw;
  163. for(i=0; i<100; i++)
  164. {
  165. if(IICReadBytes(0x1000C, (UINT8*)&fw, sizeof(fw)))
  166. {
  167. if(GetCheckSum8((UINT8*)&fw, sizeof(fw)-2)==fw.checksum)
  168. {
  169. PRINT("pid1=%s\n", fw.patch_pid);
  170. if(fw.patch_pid[0] == '9' && fw.patch_pid[1] == '8' && fw.patch_pid[2] == '9' && fw.patch_pid[3] == '7' )
  171. {
  172. ChipType = CHIP_TYPE_BERLINA;
  173. break;
  174. }
  175. }
  176. }
  177. if(IICReadBytes(0x10014, (UINT8*)&fw, sizeof(fw)))
  178. {
  179. if(GetCheckSum8((UINT8*)&fw, sizeof(fw)-2)==fw.checksum)
  180. {
  181. PRINT("pid2=%s\n", fw.patch_pid);
  182. if((fw.patch_pid[0]=='2' && fw.patch_pid[1] == '9' && fw.patch_pid[2] == '3' && (fw.patch_pid[3] == '3' || fw.patch_pid[3] == '6'))
  183. ||(fw.patch_pid[0]=='6' && fw.patch_pid[1] == '8' && fw.patch_pid[2] == '7' )
  184. )
  185. {
  186. ChipType = CHIP_TYPE_BERLINB;
  187. break;
  188. }
  189. else if(fw.patch_pid[0]=='2' && fw.patch_pid[1] == '9' && fw.patch_pid[2] == '3' && fw.patch_pid[3] == '1' )
  190. {
  191. ChipType = CHIP_TYPE_BERLIND;
  192. break;
  193. }
  194. }
  195. }
  196. }
  197. if(i==10)
  198. {
  199. PRINT("Chip type unknown\n");
  200. if(!IsBerlinChipType(ChipType))
  201. {
  202. ChipType = CHIP_TYPE_BERLIND;
  203. }
  204. }
  205. }
  206. /*******************************************************************************
  207. * Function Name : BT_Init
  208. * Description : 触摸板初始化,获取ID,确认是否工作
  209. * Input : None
  210. * Output : None
  211. * Return : None
  212. *******************************************************************************/
  213. void BT_Init(void)
  214. {
  215. TouchProc = CheckTouchINT;
  216. CheckPos = MAX_POINT;
  217. CheckTouchChipType();
  218. if(ChipType==CHIP_TYPE_BERLINB || ChipType==CHIP_TYPE_BERLIND)
  219. {
  220. ShutdownHIDI2C();
  221. }
  222. if (IICTouchTaskId == INVALID_TASK_ID)
  223. {
  224. IICTouchTaskId = TMOS_ProcessEventRegister(IICTouch_ProcessEvent);
  225. tmos_set_event(IICTouchTaskId, HID_DEBUG_EVT);
  226. }
  227. tmos_start_task(IICTouchTaskId, CHECK_ESD_EVT, PERIO_2s );
  228. tmos_start_task(IICTouchTaskId, SYS_INIT_FINISH_EVT, PERIO_40s );
  229. PRINT("sys init\n");
  230. }
  231. static void BT_Check_ESD()
  232. {
  233. UINT32 reg_addr = 0x10170;
  234. if(ChipType==CHIP_TYPE_BERLINA)
  235. {
  236. reg_addr = 0x10168;
  237. }
  238. if(!enable_ESD_check) return;
  239. if(IICReadOneByte(reg_addr) == 0xAA)
  240. {
  241. PRINT("BT Check ESD Error!\n");
  242. ResetTouchChip(); //Rstart touch ic
  243. }
  244. else
  245. {
  246. IICWriteOneByte(reg_addr, 0xAA);
  247. }
  248. }
  249. static void ClearTouchFlag()
  250. {
  251. UINT32 reg_addr = 0x10274;
  252. if(ChipType == CHIP_TYPE_BERLINA)
  253. {
  254. reg_addr = 0x10338;
  255. }
  256. else if(ChipType == CHIP_TYPE_BERLIND)
  257. {
  258. reg_addr = 0x10308;
  259. }
  260. if(!IsDebugMode && !ReleaseFlag)
  261. {
  262. IICWriteOneByte(reg_addr, 0); //清标志
  263. }
  264. }
  265. void BT_SetTouchEvent()
  266. {
  267. tmos_set_event(IICTouchTaskId, CHECK_TOUCH_INT_EVT);
  268. }
  269. static UINT16 IICTouch_ProcessEvent( UINT8 task_id, UINT16 events )
  270. {
  271. //BOOL bSuccess = TRUE;;
  272. if(events & REPORT_AGAIN_EVT)
  273. {
  274. ReportPos();
  275. events ^= REPORT_AGAIN_EVT;
  276. goto OUT_FUMC;
  277. }
  278. if(events & START_REPORT_POS_EVT)
  279. {
  280. //PRINT("SR");
  281. StartReportPos();
  282. events ^= START_REPORT_POS_EVT;
  283. goto OUT_FUMC;
  284. }
  285. if(events & READ_ONE_POINT_EVT)
  286. {
  287. ReadOnePoint();
  288. events ^= READ_ONE_POINT_EVT;
  289. //有中断,取消USB检测
  290. events &= ~CHECK_USB_STATUS_EVT;
  291. tmos_stop_task(IICTouchTaskId, CHECK_USB_STATUS_EVT);
  292. goto OUT_FUMC;
  293. }
  294. if(events & CHECK_TOUCH_INT_EVT)
  295. {
  296. //PRINT("TI");
  297. CheckTouchINT();
  298. events ^= CHECK_TOUCH_INT_EVT;
  299. if(PointNum == 0 && SysInitFinish) //松键
  300. {
  301. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s ); //1s后开启USB检测
  302. }
  303. goto OUT_FUMC;
  304. }
  305. if(events & CHECK_ESD_EVT)
  306. {
  307. //PRINT("esd check\n");
  308. BT_Check_ESD();
  309. events ^= CHECK_ESD_EVT;
  310. tmos_start_task(IICTouchTaskId, CHECK_ESD_EVT, PERIO_2s );
  311. goto OUT_FUMC;
  312. }
  313. if(events & SYS_INIT_FINISH_EVT)
  314. {
  315. SysInitFinish = TRUE;
  316. events ^= SYS_INIT_FINISH_EVT;
  317. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s);
  318. goto OUT_FUMC;
  319. }
  320. if(events & CHECK_USB_STATUS_EVT)
  321. {
  322. events ^= CHECK_USB_STATUS_EVT;
  323. if(CheckUsbStatus())
  324. {
  325. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_5s );//避免系统重连慢造成反复复位重连
  326. }
  327. else {
  328. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s );
  329. }
  330. goto OUT_FUMC;
  331. }
  332. if(events & HID_DEBUG_EVT)
  333. {
  334. CommandHandle();
  335. events ^= HID_DEBUG_EVT;
  336. tmos_set_event(task_id, HID_DEBUG_EVT);
  337. goto OUT_FUMC;
  338. }
  339. return 0;
  340. OUT_FUMC:
  341. return events;
  342. }
  343. static void CheckTouchINT()
  344. {
  345. //UINT8 PointNum;
  346. ST_EVENT_HEAD event_head;
  347. UINT32 reg_addr = 0x10274;
  348. if(ChipType == CHIP_TYPE_BERLINA)
  349. {
  350. reg_addr = 0x10338;
  351. }
  352. else if(ChipType == CHIP_TYPE_BERLIND)
  353. {
  354. reg_addr = 0x10308;
  355. }
  356. StylusFlag = FALSE;
  357. IICReadBytes(reg_addr, (UINT8*)&event_head, sizeof(ST_EVENT_HEAD));
  358. if(event_head.TouchEvent==0 && !ReleaseFlag)
  359. {
  360. IICWriteOneByte(reg_addr, 0); //清标志,如果延迟较长可以去掉
  361. return ;
  362. }
  363. PointNum = event_head.TouchNum;
  364. TouchNum = 0;
  365. if(PointNum > MAX_POINT) PointNum = MAX_POINT;
  366. #ifdef MOUSE_REPORT
  367. StylusFlag = FALSE;
  368. #endif
  369. NoTouchTimer = 0;
  370. ReadPointCnt = 0;
  371. OutRangeFlag = 0xFFFF;
  372. Press_Flag = 0;
  373. if(PointNum==0)
  374. {
  375. tmos_set_event(IICTouchTaskId, START_REPORT_POS_EVT);
  376. }
  377. else
  378. {
  379. tmos_set_event(IICTouchTaskId, READ_ONE_POINT_EVT);
  380. }
  381. }
  382. //__attribute__((section(".highcode")))
  383. static void ReadOnePoint()
  384. {
  385. UINT8 buf[13];
  386. UINT8 index;
  387. UINT16 tmp;
  388. UINT32 reg_addr = 0x10274;
  389. if(ChipType == CHIP_TYPE_BERLINA)
  390. {
  391. reg_addr = 0x10338;
  392. }
  393. else if(ChipType == CHIP_TYPE_BERLIND)
  394. {
  395. reg_addr = 0x10308;
  396. }
  397. reg_addr += (ReadPointCnt<<3) + sizeof(ST_EVENT_HEAD);
  398. IICReadBytes(reg_addr, buf, 8);
  399. #ifdef STYLUS_REPORT
  400. if(buf[0]&0x80)
  401. {
  402. BT_RD_Reg(BT_GSTID_REG + (PointNum << 3) ,buf+7,6); //stylus keY
  403. StylusPress = ((UINT16)buf[6]<<8)+buf[5] ; //stylus pressure
  404. StylusFlag = TRUE;
  405. if((DeviceMode!=DEVICE_MODE_MOUSE) && (BleDeviceMode!=DEVICE_MODE_MOUSE) && (!UartReportPosEn))
  406. {
  407. Press_Flag = (((UINT16)buf[12] & 0xFC) << 8) | 0x8000;
  408. buf[0] =9;//&= 0x7F;
  409. index = 9;
  410. }
  411. else
  412. {
  413. if(StylusPress==0)
  414. goto OUT_FUNC;
  415. ShareBuf[0] =0;
  416. index = 0;
  417. }
  418. }
  419. else
  420. #endif
  421. {//查找和上次相同Press_Flag的索引位置
  422. for(index=0; index<10; index++)
  423. {
  424. if(((Press_Flag_Bak0 & (1L<<index))!= 0) && TP[ index ].Contact_Identifier == (buf[0]>>4))
  425. {
  426. break; //
  427. }
  428. }
  429. if(index>=10)//没有找到配对位置,找一个空位
  430. {
  431. for(index=0; index<10; index++)
  432. {
  433. if(((Press_Flag_Bak0 | Press_Flag ) & (1L<<index)) == 0)
  434. {
  435. break; //
  436. }
  437. }
  438. }
  439. }
  440. if(index>=10) goto OUT_FUNC; //没有空位
  441. if((Press_Flag & 0x8000) && buf[0] == 9) //stylus Press_Flag
  442. {
  443. #ifdef STYLUS_TILT
  444. StylusTiltX = ((UINT16)buf[8]<<8)+buf[7] ;
  445. StylusTiltY = ((UINT16)buf[10]<<8)+buf[9] ;
  446. #endif
  447. }
  448. else
  449. {
  450. tmp = ((UINT16)buf[7]<<8)+buf[6];
  451. if(tmp==0)
  452. {
  453. goto OUT_FUNC;
  454. }
  455. }
  456. #ifdef AUTO_ADJUST_SOLUTION
  457. if(bSolutionValid)
  458. {
  459. TP[index].X_pos = (UINT32)(((UINT16)buf[2]<<8)+buf[1] ) * (RESOLUTION_X-1) / wMaxX;
  460. TP[index].Y_pos = (UINT32)(((UINT16)buf[4]<<8)+buf[3] ) * (RESOLUTION_Y-1) / wMaxY;
  461. }
  462. else
  463. #else
  464. {
  465. TP[index].X_pos = ( ((UINT16)buf[3]<<8)+buf[2] );
  466. TP[index].Y_pos = ( ((UINT16)buf[5]<<8)+buf[4] );
  467. }
  468. #endif
  469. TP[index].X_pos_back = TP[index].X_pos;
  470. TP[index].Y_pos_back = TP[index].Y_pos;
  471. #ifdef NEW_REVOLVE_PROTOCAL
  472. if (PosConvert(TP, index) == FALSE) //超出黑边的坐标返回FALSE,裁剪掉
  473. goto OUT_FUNC;
  474. #endif
  475. TP[ index ].Tip_Switch = 1;
  476. Press_Flag |= ((UINT16)1<<index);
  477. TP[ index ].Contact_Identifier = buf[0]>>4;
  478. OUT_FUNC:
  479. ReadPointCnt++;
  480. if(ReadPointCnt >= PointNum)
  481. {
  482. tmos_set_event(IICTouchTaskId, START_REPORT_POS_EVT);
  483. }
  484. else
  485. {
  486. tmos_set_event(IICTouchTaskId, READ_ONE_POINT_EVT);
  487. }
  488. }
  489. //__attribute__((section(".highcode")))
  490. void StartReportPos()
  491. {
  492. TouchNum = 0;
  493. for(UINT8 i=0; i<MAX_POINT; i++)
  494. {
  495. if((Press_Flag & (((UINT16)1)<<i)) == 0)
  496. {
  497. TP[i].Tip_Switch = 0;
  498. }
  499. else
  500. {
  501. TouchNum++;
  502. }
  503. }
  504. #ifdef DOUBLECLIK_FILETER
  505. if(TouchNum <= 1) //&& (DeviceMode == DEVICE_MODE_MOUSE))
  506. {
  507. DoubleClickFilter(StylusFlag, 0);
  508. }
  509. else
  510. {
  511. DoubleClickTimer = 100;
  512. }
  513. #endif
  514. Press_Flag &= OutRangeFlag;
  515. Press_Flag_Bak0 = Press_Flag;
  516. Press_Flag |= Press_Flag_Bak1|Press_Flag_Bak2;//|Press_Flag_Bak3;
  517. #ifdef CALL_OSD_MENU
  518. CallOSDMenu(); //双指在右下角下滑,串口上报命令调用OSD菜单
  519. #endif
  520. #ifdef GESTURE
  521. if ( DeviceMode == DEVICE_MODE_MOUSE || BleDeviceMode == DEVICE_MODE_MOUSE)
  522. {
  523. WheelMove();
  524. if (TwoPointsClick() == 1)
  525. {
  526. bclickFlag = 1;
  527. }
  528. }
  529. #endif
  530. ReportPos();
  531. }
  532. //__attribute__((section(".highcode")))
  533. static void ReportPos()
  534. {
  535. //static UINT8 nUSBFailedTimes = 0;
  536. ReportPosSuccess = TRUE;
  537. if(UsbReportPosEn || BleReportPosEn)
  538. {
  539. if(((DeviceMode == DEVICE_MODE_MULTITOUCH) && (config.report_type != EN_MOUSE_ONLY)) || (config.report_type == EN_MULTITOUCH_ONLY))
  540. {
  541. Absolute_Up_Pack(TP);
  542. }
  543. else if(config.report_type != EN_MULTITOUCH_ONLY)
  544. {
  545. ReportMousePos(TP);
  546. }
  547. }
  548. #ifdef UART_ENABLE
  549. else if(UartReportPosEn)
  550. {
  551. UartUpdatePos( &TP[0]);
  552. }
  553. #endif
  554. ClearTouchFlag();
  555. Press_Flag_Bak3 = Press_Flag_Bak2;
  556. Press_Flag_Bak2 = Press_Flag_Bak1;
  557. Press_Flag_Bak1 = Press_Flag_Bak0;
  558. tmos_stop_task( IICTouchTaskId, REPORT_AGAIN_EVT );
  559. }
  560. /*********************************************************************
  561. *********************************************************************/