该函数创建一个触摸屏设备,并将__tsDrv中注册的驱动程序与设备名绑定。创建成功后对该设备的open,close,read操作将调用__tsDrv中注册的驱动程序__tsOpen,__tsClose,__tsRead。具体实现如程序清单 34所示。
程序清单 34
INT __tsDevCreate (PCHAR pcName) { …… iTemp = (INT)iosDevAdd(&ptsDev->TS_devhdr, pcName, touch_dev_num); …… }
__tsThread
该函数是在__tsOpen中创建的触摸屏服务线程,其在执行过程中等待__tsIsr中断函数发送二进制信号量,收到信号后执行后续操作。具体实现如程序清单 35所示。
程序清单 35
static void __tsThread (TS_DEV *ptsDev) { …… /* * 等待INT_TC中断,进入中断服务函数,发送二进制信号量 */ API_SemaphoreBPend(adc_mst, LW_OPTION_WAIT_INFINITE); …… /* * Menu Start Conversion * (开始转换) */ uiRegVal = readl(REG_ADC_IER) | ADC_IER_MIEN; writel(uiRegVal, REG_ADC_IER); uiRegVal = readl(REG_ADC_CTL) | ADC_CTL_MST; writel(uiRegVal, REG_ADC_CTL); if (__tsGetXY(&ix, &iy)) { /* * 当前有点击操作. */ LW_SPIN_LOCK_QUICK(&ptsDev->TS_slLock, &iregInterLevel); ptsDev->TS_tData.kstat |= MOUSE_LEFT; ptsDev->TS_tData.xmovement = ix; ptsDev->TS_tData.ymovement = iy; LW_SPIN_UNLOCK_QUICK(&ptsDev->TS_slLock, iregInterLevel); SEL_WAKE_UP_ALL(&ptsDev->TS_selwulList, SELREAD); /* 释放所有等待读的线程 */ } else { /* * 当前没有点击操作. */ if (ptsDev->TS_tData.kstat & MOUSE_LEFT) { LW_SPIN_LOCK_QUICK(&ptsDev->TS_slLock, &iregInterLevel); ptsDev->TS_tData.kstat &= (~MOUSE_LEFT); LW_SPIN_UNLOCK_QUICK(&ptsDev->TS_slLock, iregInterLevel); } if (ptsDev->TS_bIsReadRel == LW_FALSE) { /* 没有读取到释放操作 */ SEL_WAKE_UP_ALL(&ptsDev->TS_selwulList, SELREAD); /* 释放所有等待读的线程 */ } } } } static INT __tsGetXY (INT *pX, INT *pY) { /* * 等待INT_ADC中断,进入中断服务函数,发送二进制信号量adc_sem */ API_SemaphoreBPend(adc_sem, LW_OPTION_WAIT_INFINITE); *pX = abs_xp; *pY = abs_yp; return send_press; }
__tsIsr