?? apci1710_chrono.c
字號:
/***********************/ /* Test if chronometer */ /***********************/ if ((devpriv->s_BoardInfos. dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF0000UL) == APCI1710_CHRONOMETER) { /***********************************/ /* Test if chronometer initialised */ /***********************************/ if (devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. b_ChronoInit == 1) { switch(b_Action) { case APCI1710_ENABLE : /*********************************/ /* Test the cycle mode parameter */ /*********************************/ if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) { /***************************/ /* Test the interrupt flag */ /***************************/ if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) { /***************************/ /* Save the interrupt flag */ /***************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. b_InterruptMask = b_InterruptEnable; /***********************/ /* Save the cycle mode */ /***********************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. b_CycleMode = b_CycleMode; devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. dw_ConfigReg = (devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. dw_ConfigReg & 0x8F) | ((1 & b_InterruptEnable) << 5) | ((1 & b_CycleMode) << 6) | 0x10 ; /*****************************/ /* Test if interrupt enabled */ /*****************************/ if (b_InterruptEnable == APCI1710_ENABLE) { /****************************/ /* Clear the interrupt flag */ /****************************/ outl(devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo.dw_ConfigReg, devpriv->s_BoardInfos. ui_Address + 32 + (64 * b_ModulNbr)); devpriv->tsk_Current=current; // Save the current process task structure } /***********************************/ /* Enable or disable the interrupt */ /* Enable the chronometer */ /***********************************/ outl(devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo.dw_ConfigReg,devpriv->s_BoardInfos. ui_Address + 16 + (64 * b_ModulNbr)); /*************************/ /* Clear status register */ /*************************/ outl(0,devpriv->s_BoardInfos.ui_Address + 36 + (64 * b_ModulNbr)); } // if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) else { /********************************/ /* Interrupt parameter is wrong */ /********************************/ DPRINTK("Interrupt parameter is wrong\n"); i_ReturnValue = -6; } // if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) } // if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) else { /***********************************************/ /* Chronometer acquisition mode cycle is wrong */ /***********************************************/ DPRINTK("Chronometer acquisition mode cycle is wrong\n"); i_ReturnValue = -5; } // if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) break; case APCI1710_DISABLE : devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. b_InterruptMask = 0; devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. dw_ConfigReg = devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. dw_ConfigReg & 0x2F; /***************************/ /* Disable the interrupt */ /* Disable the chronometer */ /***************************/ outl(devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo.dw_ConfigReg, devpriv->s_BoardInfos. ui_Address + 16 + (64 * b_ModulNbr)); /***************************/ /* Test if continuous mode */ /***************************/ if (devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo.b_CycleMode == APCI1710_CONTINUOUS) { /*************************/ /* Clear status register */ /*************************/ outl(0,devpriv->s_BoardInfos.ui_Address + 36 + (64 * b_ModulNbr)); } break; default: DPRINTK("Inputs wrong! Enable or Disable chrono\n"); i_ReturnValue = -8; } // switch ENABLE/DISABLE } else { /*******************************/ /* Chronometer not initialised */ /*******************************/ DPRINTK("Chronometer not initialised\n"); i_ReturnValue = -4; } } else { /******************************************/ /* The module is not a Chronometer module */ /******************************************/ DPRINTK("The module is not a Chronometer module\n"); i_ReturnValue = -3; } } else { /***********************/ /* Module number error */ /***********************/ DPRINTK("Module number error\n"); i_ReturnValue = -2; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function Name :INT i_APCI1710_InsnReadChrono(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Read functions for Timer |+----------------------------------------------------------------------------+| Input Parameters : +----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : +----------------------------------------------------------------------------+*/INT i_APCI1710_InsnReadChrono(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){ BYTE b_ReadType; INT i_ReturnValue=insn->n; b_ReadType=CR_CHAN(insn->chanspec); switch(b_ReadType) { case APCI1710_CHRONO_PROGRESS_STATUS: i_ReturnValue=i_APCI1710_GetChronoProgressStatus (dev, (BYTE) CR_AREF(insn->chanspec), (PBYTE) &data[0]); break; case APCI1710_CHRONO_READVALUE: i_ReturnValue=i_APCI1710_ReadChronoValue (dev, (BYTE) CR_AREF(insn->chanspec), (UINT) insn->unused[0], (PBYTE) &data[0], (PULONG) &data[1]); break; case APCI1710_CHRONO_CONVERTVALUE: i_ReturnValue=i_APCI1710_ConvertChronoValue (dev, (BYTE) CR_AREF(insn->chanspec), (ULONG) insn->unused[0], (PULONG) &data[0], (PBYTE) &data[1], (PBYTE) &data[2], (PUINT) &data[3], (PUINT) &data[4], (PUINT) &data[5]); break; case APCI1710_CHRONO_READINTERRUPT: printk("In Chrono Read Interrupt\n"); 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; data[2]=devpriv->s_InterruptParameters. s_FIFOInterruptParameters [devpriv-> s_InterruptParameters. ui_Read].ul_OldCounterLatchValue; /**************************/ /* Increment the read FIFO */ /***************************/ devpriv-> s_InterruptParameters. ui_Read = (devpriv-> s_InterruptParameters. ui_Read + 1) % APCI1710_SAVE_INTERRUPT; break; default: printk("ReadType Parameter wrong\n"); } if(i_ReturnValue>=0) i_ReturnValue =insn->n; return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function Name : _INT_ i_APCI1710_GetChronoProgressStatus || (BYTE_ b_BoardHandle, || BYTE_ b_ModulNbr, || PBYTE_ pb_ChronoStatus) |+----------------------------------------------------------------------------+| Task : Return the chronometer status (pb_ChronoStatus) from || selected chronometer 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_ pb_ChronoStatus : Return the chronometer || status. || 0 : Measurement not started.|| No start signal occur. || 1 : Measurement started. || A start signal occur. || 2 : Measurement stopped. || A stop signal occur. || The measurement is || terminate. || 3: A overflow occur. You || must change the base || timing witch the || function || "i_APCI1710_InitChrono" |+----------------------------------------------------------------------------+| Return Value : 0: No error || -1: The handle parameter of the board is wrong || -2: Module selection wrong || -3: The module is not a Chronometer module || -4: Chronometer not initialised see function || "i_APCI1710_InitChrono" |+----------------------------------------------------------------------------+*/INT i_APCI1710_GetChronoProgressStatus (comedi_device *dev, BYTE b_ModulNbr, PBYTE pb_ChronoStatus) { INT i_ReturnValue = 0; DWORD dw_Status; /**************************/ /* Test the module number */ /**************************/ if (b_ModulNbr < 4) {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -