JDTouch.c 11 KB

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