JDTouch.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : JD9366.c
  3. * Author : Wngcool
  4. * Version : V1.0
  5. * Date : 2025/11/24
  6. * Description : 对JD9366(incell)的操作
  7. *******************************************************************************/
  8. /*********************************************************************
  9. * INCLUDES
  10. */
  11. #include "include.h"
  12. #include "typedef.h"
  13. #include "TouchInclude.h"
  14. #define READ_TOUCH_POS_EVT 0x0001
  15. #define READ_RESET_TOUCH_IC_EVT 0x0002
  16. #define SYS_INIT_FINISH_EVT 0x0004
  17. #define RELEASE_TOUCH_EVT 0x0008
  18. #define READ_ONE_POINT_EVT 0x0010
  19. #define START_REPORT_POS_EVT 0x0020
  20. #define CHECK_TOUCH_INT_EVT 0x0040
  21. #define REPORT_AGAIN_EVT 0x0080
  22. #define CHECK_ESD_EVT 0x0100
  23. #define HID_DEBUG_EVT 0x0200
  24. #define CHECK_USB_STATUS_EVT 0x0400
  25. #define PERIO_1s 1600
  26. #define PERIO_2s (PERIO_1s*2)
  27. #define PERIO_5s (PERIO_1s*5)
  28. #define PERIO_40s (PERIO_1s*40)
  29. #pragma pack(1)
  30. typedef struct{
  31. UINT8 rom_pid[6]; /* rom PID */
  32. UINT8 rom_vid[3]; /* Mask VID */
  33. UINT8 rom_vid_reserved;
  34. UINT8 patch_pid[8]; /* Patch PID */
  35. UINT8 patch_vid[4]; /* Patch VID */
  36. UINT8 patch_vid_reserved;
  37. UINT8 sensor_id;
  38. UINT8 reserved[2];
  39. UINT16 checksum;
  40. }ST_FW_VERSION;
  41. static UINT8 IICTouchTaskId = INVALID_TASK_ID;
  42. static UINT8 PointNum = 0;
  43. static UINT8 ReadPointCnt = 0;
  44. static BOOL ReportPosSuccess = TRUE;
  45. static UINT8 ReadPointIndexCnt = 0;
  46. static void ReadOnePoint(void);
  47. static void CheckTouchINT(void);
  48. static void StartReportPos(void);
  49. static void ReportPos(void);
  50. static UINT16 IICTouch_ProcessEvent( UINT8 task_id, UINT16 events );
  51. //static void BT_Check_ESD();
  52. #ifdef MOUSE_REPORT
  53. #ifndef GESTURE
  54. extern UINT8 mouse_right_click_time;
  55. #endif
  56. #ifndef GESTURE
  57. extern void ReportMousePos(POINTER * pTP);
  58. #else
  59. void ReportMousePos(POINTER * pTP, UINT8 interface);
  60. #endif
  61. #endif
  62. static UINT32 lJDRegAddr;
  63. static BOOL SysInitFinish = FALSE;
  64. extern BOOL SleepEn;
  65. /*******************************************************************************
  66. * Function Name : JD_WR_Reg
  67. * Description : 向GT911写入一次数据
  68. * Input : reg:起始寄存器地址
  69. buf:数据缓缓存区
  70. len:写数据长度
  71. * Output : None
  72. * Return : 0,成功;1,失败.
  73. *******************************************************************************/
  74. __attribute__((section(".highcode")))
  75. UINT8 JD_WR_Reg(UINT32 reg,UINT8 *buf,UINT8 len)
  76. {
  77. return IICWriteBytes(reg,buf,len);
  78. }
  79. ///*******************************************************************************
  80. //* Function Name : JD_RD_Reg
  81. //* Description : 从GT911读出一次数据
  82. //* Input : reg:起始寄存器地址
  83. // buf:数据缓缓存区
  84. // len:读数据长度
  85. //* Output : None
  86. //* Return : None
  87. //*******************************************************************************/
  88. //__attribute__((section(".highcode")))
  89. UINT8 JD_RD_Reg(UINT32 reg, UINT8 *buf,UINT8 len)
  90. {
  91. return IICReadBytes(reg, buf, len);
  92. }
  93. /*******************************************************************************
  94. * Function Name : JD_Init
  95. * Description : 触摸板初始化,获取ID,确认是否工作
  96. * Input : None
  97. * Output : None
  98. * Return : None
  99. *******************************************************************************/
  100. void JD_Init()
  101. {
  102. TouchProc = CheckTouchINT;
  103. CheckPos = MAX_POINT;
  104. if (IICTouchTaskId == INVALID_TASK_ID)
  105. {
  106. IICTouchTaskId = TMOS_ProcessEventRegister(IICTouch_ProcessEvent);
  107. tmos_set_event(IICTouchTaskId, HID_DEBUG_EVT);
  108. }
  109. //tmos_start_task(IICTouchTaskId, CHECK_ESD_EVT, PERIO_2s );
  110. tmos_start_task(IICTouchTaskId, SYS_INIT_FINISH_EVT, PERIO_40s );
  111. PRINT("sys init\n");
  112. }
  113. /*
  114. static void BT_Check_ESD()
  115. {
  116. UINT32 reg_addr = 0x10170;
  117. if(ChipType==CHIP_TYPE_BERLINA)
  118. {
  119. reg_addr = 0x10168;
  120. }
  121. if(!enable_ESD_check) return;
  122. if(IICReadOneByte(reg_addr) == 0xAA)
  123. {
  124. PRINT("BT Check ESD Error!\n");
  125. ResetTouchChip(); //Rstart touch ic
  126. }
  127. else
  128. {
  129. IICWriteOneByte(reg_addr, 0xAA);
  130. }
  131. }
  132. */
  133. /*
  134. static void ClearTouchFlag()
  135. {
  136. UINT32 reg_addr = 0x10274;
  137. if(ChipType == CHIP_TYPE_BERLINA)
  138. {
  139. reg_addr = 0x10338;
  140. }
  141. else if(ChipType == CHIP_TYPE_BERLIND)
  142. {
  143. reg_addr = 0x10308;
  144. }
  145. }
  146. */
  147. void JD_SetTouchEvent()
  148. {
  149. tmos_set_event(IICTouchTaskId, CHECK_TOUCH_INT_EVT);
  150. }
  151. static UINT16 IICTouch_ProcessEvent( UINT8 task_id, UINT16 events )
  152. {
  153. //BOOL bSuccess = TRUE;;
  154. if(events & REPORT_AGAIN_EVT)
  155. {
  156. ReportPos();
  157. events ^= REPORT_AGAIN_EVT;
  158. goto OUT_FUMC;
  159. }
  160. if(events & START_REPORT_POS_EVT)
  161. {
  162. //PRINT("SR");
  163. StartReportPos();
  164. events ^= START_REPORT_POS_EVT;
  165. goto OUT_FUMC;
  166. }
  167. if(events & READ_ONE_POINT_EVT)
  168. {
  169. ReadOnePoint();
  170. events ^= READ_ONE_POINT_EVT;
  171. //有中断,取消USB检测
  172. events &= ~CHECK_USB_STATUS_EVT;
  173. tmos_stop_task(IICTouchTaskId, CHECK_USB_STATUS_EVT);
  174. goto OUT_FUMC;
  175. }
  176. if(events & CHECK_TOUCH_INT_EVT)
  177. {
  178. //PRINT("TI");
  179. CheckTouchINT();
  180. events ^= CHECK_TOUCH_INT_EVT;
  181. if(PointNum == 0) //松键
  182. {
  183. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s ); //1s后开启USB检测
  184. }
  185. goto OUT_FUMC;
  186. }
  187. //if(events & CHECK_ESD_EVT)
  188. //{
  189. // //PRINT("esd check\n");
  190. // BT_Check_ESD();
  191. // events ^= CHECK_ESD_EVT;
  192. // tmos_start_task(IICTouchTaskId, CHECK_ESD_EVT, PERIO_2s );
  193. // goto OUT_FUMC;
  194. //}
  195. if(events & SYS_INIT_FINISH_EVT)
  196. {
  197. SysInitFinish = TRUE;
  198. events ^= SYS_INIT_FINISH_EVT;
  199. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s);
  200. goto OUT_FUMC;
  201. }
  202. if(events & CHECK_USB_STATUS_EVT)
  203. {
  204. events ^= CHECK_USB_STATUS_EVT;
  205. CheckUsbStatus();
  206. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s );
  207. goto OUT_FUMC;
  208. }
  209. if(events & HID_DEBUG_EVT)
  210. {
  211. CommandHandle();
  212. events ^= HID_DEBUG_EVT;
  213. tmos_set_event(task_id, HID_DEBUG_EVT);
  214. goto OUT_FUMC;
  215. }
  216. return 0;
  217. OUT_FUMC:
  218. return events;
  219. }
  220. static void CheckTouchINT()
  221. {
  222. lJDRegAddr = 0x20021120;
  223. PointNum = IICReadOneByte(lJDRegAddr); //read point number
  224. TouchNum = 0;
  225. if(PointNum > MAX_POINT) PointNum = MAX_POINT;
  226. NoTouchTimer = 0;
  227. ReadPointCnt = 0;
  228. ReadPointIndexCnt = 0;
  229. OutRangeFlag = 0xFFFF;
  230. Press_Flag = 0;
  231. if(PointNum==0)
  232. {
  233. tmos_set_event(IICTouchTaskId, START_REPORT_POS_EVT);
  234. }
  235. else
  236. {
  237. lJDRegAddr += 3;
  238. tmos_set_event(IICTouchTaskId, READ_ONE_POINT_EVT);
  239. }
  240. }
  241. //__attribute__((section(".highcode")))
  242. static void ReadOnePoint()
  243. {
  244. UINT8 buf[5];
  245. UINT8 Contact_Identifier;
  246. UINT8 index = 0;
  247. UINT16 tmp;
  248. IICReadBytes(lJDRegAddr, buf, 5);
  249. lJDRegAddr += 5;
  250. ReadPointIndexCnt++;
  251. if (buf[4]) //coor weight
  252. {
  253. Contact_Identifier = ReadPointIndexCnt;
  254. }
  255. else
  256. {
  257. if(ReadPointCnt < PointNum)
  258. tmos_set_event(IICTouchTaskId, READ_ONE_POINT_EVT);
  259. else
  260. tmos_set_event(IICTouchTaskId, START_REPORT_POS_EVT);
  261. return;
  262. }
  263. //查找和上次相同Press_Flag的索引位置
  264. for (index = 0; index < 10; index++)
  265. {
  266. if(((Press_Flag_Bak0 & (1L<<index))!= 0) && TP[ index ].Contact_Identifier == Contact_Identifier)
  267. {
  268. break; //
  269. }
  270. }
  271. if (index >= 10)//没有找到配对位置,找一个空位
  272. {
  273. for(index = 0; index < 10; index++)
  274. {
  275. if(((Press_Flag_Bak0 | Press_Flag ) & (1L<<index)) == 0)
  276. {
  277. break; //
  278. }
  279. }
  280. }
  281. if (index >= 10) goto OUT_FUNC; //没有空位
  282. tmp = buf[4];
  283. if (tmp == 0)
  284. {
  285. goto OUT_FUNC;
  286. }
  287. #ifdef AUTO_ADJUST_SOLUTION
  288. if(bSolutionValid)
  289. {
  290. TP[index].X_pos = (UINT32)(((UINT16)buf[2]<<8)+buf[1] ) * (RESOLUTION_X-1) / wMaxX;
  291. TP[index].Y_pos = (UINT32)(((UINT16)buf[4]<<8)+buf[3] ) * (RESOLUTION_Y-1) / wMaxY;
  292. }
  293. else
  294. #else
  295. {
  296. TP[index].X_pos = ( ((UINT16)buf[0]<<8)+buf[1] );
  297. TP[index].Y_pos = ( ((UINT16)buf[2]<<8)+buf[3] );
  298. }
  299. #endif
  300. TP[index].X_pos_back = TP[index].X_pos;
  301. TP[index].Y_pos_back = TP[index].Y_pos;
  302. #ifdef NEW_REVOLVE_PROTOCAL
  303. if (PosConvert(TP, index) == FALSE) //超出黑边的坐标返回FALSE,裁剪掉
  304. goto OUT_FUNC;
  305. #endif
  306. TP[ index ].Tip_Switch = 1;
  307. Press_Flag |= ((UINT16)1<<index);
  308. TP[ index ].Contact_Identifier = Contact_Identifier;
  309. OUT_FUNC:
  310. ReadPointCnt++;
  311. if(ReadPointCnt >= PointNum)
  312. {
  313. tmos_set_event(IICTouchTaskId, START_REPORT_POS_EVT);
  314. }
  315. else
  316. {
  317. tmos_set_event(IICTouchTaskId, READ_ONE_POINT_EVT);
  318. }
  319. }
  320. //__attribute__((section(".highcode")))
  321. void StartReportPos()
  322. {
  323. TouchNum = 0;
  324. for (UINT8 i = 0; i < MAX_POINT; i++)
  325. {
  326. if((Press_Flag & (((UINT16)1)<<i)) == 0)
  327. {
  328. TP[i].Tip_Switch = 0;
  329. }
  330. else
  331. {
  332. TouchNum++;
  333. }
  334. }
  335. #ifdef DOUBLECLIK_FILETER
  336. if(TouchNum <= 1) //&& (DeviceMode == DEVICE_MODE_MOUSE))
  337. {
  338. DoubleClickFilter(0, 0);
  339. }
  340. else
  341. {
  342. DoubleClickTimer = 100;
  343. }
  344. #endif
  345. #ifdef CALL_OSD_MENU
  346. CallOSDMenu(); //双指在右下角下滑,串口上报命令调用OSD菜单
  347. #endif
  348. #ifdef GESTURE
  349. if ( DeviceMode == DEVICE_MODE_MOUSE || BleDeviceMode == DEVICE_MODE_MOUSE)
  350. {
  351. WheelMove();
  352. if (TwoPointsClick() == 1)
  353. {
  354. bclickFlag = 1;
  355. }
  356. }
  357. #endif
  358. Press_Flag &= OutRangeFlag;
  359. for(UINT8 i = 0; i < MAX_POINT; i++)
  360. {
  361. if((Press_Flag & (((UINT16)1)<<i)) == 0)
  362. {
  363. TP[i].Tip_Switch = 0;
  364. }
  365. }
  366. Press_Flag_Bak0 = Press_Flag;
  367. Press_Flag |= Press_Flag_Bak1|Press_Flag_Bak2;//|Press_Flag_Bak3;
  368. ReportPos();
  369. }
  370. //__attribute__((section(".highcode")))
  371. static void ReportPos()
  372. {
  373. //static UINT8 nUSBFailedTimes = 0;
  374. ReportPosSuccess = TRUE;
  375. if (UsbReportPosEn || bTransmitEn)
  376. {
  377. if (bTransmitEn && !UsbReportPosEn)
  378. {
  379. #ifdef UART_ENABLE
  380. //UartUpdatePos( &TP[0]);
  381. #endif
  382. Absolute_Up_Pack(TP);
  383. }
  384. else if(((DeviceMode == DEVICE_MODE_MULTITOUCH) && (config.report_type != EN_MOUSE_ONLY)) || (config.report_type == EN_MULTITOUCH_ONLY))
  385. {
  386. Absolute_Up_Pack(TP);
  387. }
  388. #ifdef MOUSE_REPORT
  389. else if(config.report_type != EN_MULTITOUCH_ONLY)
  390. {
  391. ReportMousePos(TP);
  392. }
  393. #endif
  394. }
  395. #ifdef UART_ENABLE
  396. //else if(UartReportPosEn)
  397. //{
  398. // UartUpdatePos( &TP[0]);
  399. //}
  400. #endif
  401. if(ReportPosSuccess)// || (EnumOK==FALSE && IsBLEConnected()==FALSE))
  402. {
  403. //ClearTouchFlag();
  404. Press_Flag_Bak3 = Press_Flag_Bak2;
  405. Press_Flag_Bak2 = Press_Flag_Bak1;
  406. Press_Flag_Bak1 = Press_Flag_Bak0;
  407. //tmos_stop_task( IICTouchTaskId, REPORT_AGAIN_EVT );
  408. tmos_start_task(IICTouchTaskId, CHECK_USB_STATUS_EVT, PERIO_1s ); //1s后开启USB检测
  409. }
  410. else
  411. {
  412. //tmos_set_event(IICTouchTaskId, REPORT_AGAIN_EVT);
  413. //tmos_start_task(IICTouchTaskId, REPORT_AGAIN_EVT,3);
  414. //GPIOA_InverseBits(GPIO_Pin_2);
  415. }
  416. }
  417. /*********************************************************************
  418. *********************************************************************/