📄 apci1710_82x54.c
字号:
| -3: Timer selection wrong || -4: The module is not a TIMER module || -5: Timer not initialised see function || "i_APCI1710_InitTimer" || -6: Interrupt parameter is wrong || -7: Interrupt function not initialised. || See function "i_APCI1710_SetBoardIntRoutineX" |+----------------------------------------------------------------------------+*/INT i_APCI1710_InsnWriteEnableDisableTimer(comedi_device *dev,comedi_subdevice *s, comedi_insn *insn,lsampl_t *data) { INT i_ReturnValue = 0; DWORD dw_DummyRead; BYTE b_ModulNbr; BYTE b_TimerNbr; BYTE b_ActionType; BYTE b_InterruptEnable; i_ReturnValue=insn->n; b_ModulNbr = (BYTE) CR_AREF(insn->chanspec); b_TimerNbr = (BYTE) CR_CHAN(insn->chanspec); b_ActionType = (BYTE) data[0]; // enable disable /**************************/ /* Test the module number */ /**************************/ if (b_ModulNbr < 4) { /***********************/ /* Test if 82X54 timer */ /***********************/ if ((devpriv->s_BoardInfos. dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF0000UL) == APCI1710_82X54_TIMER) { /*************************/ /* Test the timer number */ /*************************/ if (b_TimerNbr <= 2) { /*****************************/ /* Test if timer initialised */ /*****************************/ if (devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. b_82X54Init == 1) { switch(b_ActionType) { case APCI1710_ENABLE: b_InterruptEnable = (BYTE) data[1]; /********************************/ /* Test the interrupt selection */ /********************************/ if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) { if (b_InterruptEnable == APCI1710_ENABLE) { dw_DummyRead=inl(devpriv->s_BoardInfos. ui_Address + 12 + (b_TimerNbr * 4) + (64 * b_ModulNbr)); /************************/ /* Enable the interrupt */ /************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord = devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord | 0x8; outl(devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord,devpriv->s_BoardInfos. ui_Address + 32 + (b_TimerNbr * 4) + (64 * b_ModulNbr)); devpriv->tsk_Current=current; // Save the current process task structure } // if (b_InterruptEnable == APCI1710_ENABLE) else { /*************************/ /* Disable the interrupt */ /*************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord = devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord & 0xF7; outl(devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord,devpriv->s_BoardInfos. ui_Address + 32 + (b_TimerNbr * 4) + (64 * b_ModulNbr)); /***************************/ /* Save the interrupt flag */ /***************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. b_InterruptMask = devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. b_InterruptMask & (0xFF - (1 << b_TimerNbr)); } // if (b_InterruptEnable == APCI1710_ENABLE) /***********************/ /* Test if error occur */ /***********************/ if (i_ReturnValue >= 0) { /***************************/ /* Save the interrupt flag */ /***************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. b_InterruptMask = devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. b_InterruptMask | ((1 & b_InterruptEnable) << b_TimerNbr); /********************/ /* Enable the timer */ /********************/ outl(1,devpriv->s_BoardInfos. ui_Address + 44 + (b_TimerNbr * 4) + (64 * b_ModulNbr)); } } else { /********************************/ /* Interrupt parameter is wrong */ /********************************/ DPRINTK("\n"); i_ReturnValue = -6; } break; case APCI1710_DISABLE: /***************************/ /* Test the interrupt flag */ /***************************/ if (((devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. b_InterruptMask >> b_TimerNbr) & 1) == 1) { /*************************/ /* Disable the interrupt */ /*************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord = devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord & 0xF7; outl(devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. s_82X54TimerInfo [b_TimerNbr]. dw_ConfigurationWord,devpriv->s_BoardInfos. ui_Address + 32 + (b_TimerNbr * 4) + (64 * b_ModulNbr)); /***************************/ /* Save the interrupt flag */ /***************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo. b_InterruptMask = devpriv->s_ModuleInfo [b_ModulNbr]. s_82X54ModuleInfo.b_InterruptMask & (0xFF - (1 << b_TimerNbr)); } /*********************/ /* Disable the timer */ /*********************/ outl(0,devpriv->s_BoardInfos. ui_Address + 44 + (b_TimerNbr * 4) + (64 * b_ModulNbr)); break; }// Switch end } else { /**************************************/ /* Timer not initialised see function */ /**************************************/ DPRINTK("Timer not initialised see function\n"); i_ReturnValue = -5; } } else { /*************************/ /* Timer selection wrong */ /*************************/ DPRINTK("Timer selection wrong\n"); i_ReturnValue = -3; } // if ((b_TimerNbr >= 0) && (b_TimerNbr <= 2)) } else { /************************************/ /* The module is not a TIMER module */ /************************************/ DPRINTK("The module is not a TIMER module\n"); i_ReturnValue = -4; } } else { /***********************/ /* Module number error */ /***********************/ DPRINTK("Module number error\n"); i_ReturnValue = -2; } return (i_ReturnValue); } /*+----------------------------------------------------------------------------+| Function Name : _INT_ i_APCI1710_ReadAllTimerValue || (BYTE_ b_BoardHandle, || BYTE_ b_ModulNbr, || PULONG_ pul_TimerValueArray)INT i_APCI1710_InsnReadAllTimerValue(comedi_device *dev,comedi_subdevice *s, comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Return the all timer values from selected timer || module (b_ModulNbr). |+----------------------------------------------------------------------------+| Input Parameters : BYTE_ b_BoardHandle : Handle of board || APCI-1710 || BYTE_ b_ModulNbr : Selected module number || (0 to 3) |+----------------------------------------------------------------------------+| Output Parameters : PULONG_ pul_TimerValueArray : Timer value array. || Element 0 contain the timer 0 value. || Element 1 contain the timer 1 value. || Element 2 contain the timer 2 value. |+----------------------------------------------------------------------------+| Return Value : 0: No error || -1: The handle parameter of the board is wrong || -2: Module selection wrong || -3: The module is not a TIMER module || -4: Timer 0 not initialised see function || "i_APCI1710_InitTimer" || -5: Timer 1 not initialised see function || "i_APCI1710_InitTimer" || -6: Timer 2 not initialised see function || "i_APCI1710_InitTimer" |+----------------------------------------------------------------------------+*/INT i_APCI1710_InsnReadAllTimerValue(comedi_device *dev,comedi_subdevice *s, comedi_insn *insn,lsampl_t *data) { INT i_ReturnValue = 0; BYTE b_ModulNbr,b_ReadType; PULONG pul_TimerValueArray; b_ModulNbr=CR_AREF(insn->chanspec); b_ReadType=CR_CHAN(insn->chanspec); pul_TimerValueArray=(PULONG) data; i_ReturnValue=insn->n; switch(b_ReadType) { case APCI1710_TIMER_READINTERRUPT: data[0]=devpriv->s_InterruptParameters. s_FIFOInterruptParameters [devpriv-> s_InterruptParameters. ui_Read].b_OldModuleMask; data[1]=devpriv->s_InterruptParameters. s_FIFOInterruptParameters [devpriv-> s_InterruptParameters. ui_Read].ul_OldInterruptMask;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -