NUC970平台触摸屏驱动移植(2)

该函数创建一个触摸屏设备,并将__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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/60b54a751ee374d2f7b83a966e80b0d2.html