📄 hwdrv_apci035.c
字号:
{ //Stop The Watchdog ui_Command=0; //ui_Command = inl(devpriv->iobase+((i_WatchdogNbr-1)*32)+12); //ui_Command = ui_Command & 0xFFFFF9FEUL; outl(ui_Command,devpriv->iobase+((i_WatchdogNbr-1)*32)+12); } // if (data[1]==0) if(data[0]==3)//stop all Watchdogs { ui_Command=0; for(i_Count=1;i_Count<=4;i_Count++) { if(devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG) { ui_Command=0x2UL; } else { ui_Command = 0x10UL; } i_WatchdogNbr=i_Count; outl(ui_Command,devpriv->iobase+((i_WatchdogNbr-1)*32) + 0); } } if(data[0]==4)//start all Watchdogs { ui_Command = 0; for(i_Count=1;i_Count<=4;i_Count++) { if(devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG) { ui_Command = 0x1UL; } else { ui_Command = 0x8UL; } i_WatchdogNbr=i_Count; outl(ui_Command,devpriv->iobase+((i_WatchdogNbr-1)*32) + 0); } } if(data[0]==5)//trigger all Watchdogs { ui_Command =0; for(i_Count=1;i_Count<=4;i_Count++) { if(devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG) { ui_Command=0x4UL; } else { ui_Command = 0x20UL; } i_WatchdogNbr=i_Count; outl(ui_Command,devpriv->iobase+((i_WatchdogNbr-1)*32) + 0); } i_Temp=1; } return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : int i_APCI035_ReadTimerWatchdog || (comedi_device *dev,comedi_subdevice *s, | | comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Read The Selected Timer , Counter or Watchdog |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || UINT *data : Data Pointer contains || configuration parameters as below || | | |+----------------------------------------------------------------------------+| Output Parameters : data[0] : software trigger status data[1] : hardware trigger status | data[2] : Software clear status data[3] : Overflow status data[4] : Timer actual value +----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI035_ReadTimerWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){UINT ui_Status = 0; // Status register i_WatchdogNbr=insn->unused[0]; /******************/ /* Get the status */ /******************/ ui_Status =inl(devpriv->iobase+((i_WatchdogNbr-1)*32) + 16); /***********************************/ /* Get the software trigger status */ /***********************************/ data[0] = ((ui_Status >> 1) & 1); /***********************************/ /* Get the hardware trigger status */ /***********************************/ data[1] = ((ui_Status >> 2) & 1); /*********************************/ /* Get the software clear status */ /*********************************/ data[2] = ((ui_Status >> 3) & 1); /***************************/ /* Get the overflow status */ /***************************/ data[3] = ((ui_Status >> 0) & 1); if (devpriv->b_TimerSelectMode==ADDIDATA_TIMER) { data[4]=inl(devpriv->iobase+((i_WatchdogNbr-1)*32) + 0); } // if (devpriv->b_TimerSelectMode==ADDIDATA_TIMER) return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : INT i_APCI035_ConfigAnalogInput || (comedi_device *dev,comedi_subdevice *s, | | comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Configures The Analog Input Subdevice |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || comedi_subdevice *s : Subdevice Pointer | | comedi_insn *insn : Insn Structure Pointer | | lsampl_t *data : Data Pointer contains || configuration parameters as below || data[0] : Warning delay value | | +----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI035_ConfigAnalogInput(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) {devpriv->tsk_Current=current;outl(0x200 | 0, devpriv->iobase+128 + 0x4);outl(0, devpriv->iobase+128 + 0);/********************************//* Initialise the warning value *//********************************/outl(0x300 | 0, devpriv->iobase+128 + 0x4);outl((data[0] << 8), devpriv->iobase+128 + 0);outl(0x200000UL , devpriv->iobase+128 + 12);return insn->n;} /*+----------------------------------------------------------------------------+| Function Name : int i_APCI035_ReadAnalogInput || (comedi_device *dev,comedi_subdevice *s, | | comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Read value of the selected channel |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || UINT ui_NoOfChannels : No Of Channels To read || UINT *data : Data Pointer to read status |+----------------------------------------------------------------------------+| Output Parameters : -- || data[0] : Digital Value Of Input || |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI035_ReadAnalogInput(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) { UINT ui_CommandRegister=0;/******************//* Set the start *//******************/ui_CommandRegister =0x80000; /******************************/ /* Write the command register */ /******************************/outl(ui_CommandRegister, devpriv->iobase+128 + 8); /***************************************//* Read the digital value of the input *//***************************************/data[0] = inl (devpriv->iobase+ 128 + 28); return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : int i_APCI035_Reset(comedi_device *dev) || |+----------------------------------------------------------------------------+| Task :Resets the registers of the card |+----------------------------------------------------------------------------+| Input Parameters : |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : || |+----------------------------------------------------------------------------+*/INT i_APCI035_Reset(comedi_device *dev){INT i_Count=0;for(i_Count=1;i_Count<=4;i_Count++) { i_WatchdogNbr=i_Count; outl(0x0,devpriv->iobase+((i_WatchdogNbr-1)*32) + 0);//stop all timers }outl(0x0 , devpriv->iobase+128 + 12);//Disable the warning delay return 0;}/*+----------------------------------------------------------------------------+| Function Name : static void v_APCI035_Interrupt || (int irq , void *d, struct pt_regs *regs) |+----------------------------------------------------------------------------+| Task : Interrupt processing Routine |+----------------------------------------------------------------------------+| Input Parameters : int irq : irq number || void *d : void pointer || struct pt_regs *regs : structure pointer |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/static void v_APCI035_Interrupt(int irq, void *d, struct pt_regs *regs) { comedi_device *dev = d; UINT ui_StatusRegister1 = 0; UINT ui_StatusRegister2=0; UINT ui_ReadCommand =0; UINT ui_ChannelNumber=0; UINT ui_DigitalTemperature=0; if(i_Temp==1) { i_WatchdogNbr=i_Flag; i_Flag=i_Flag+1; } /**************************************/ /* Read the interrupt status register of temperature Warning */ /**************************************/ ui_StatusRegister1 = inl(devpriv->iobase+128 + 16); /**************************************/ /* Read the interrupt status register for Watchdog/timer */ /**************************************/ ui_StatusRegister2 = inl (devpriv->iobase+((i_WatchdogNbr-1)*32) + 20); if ((((ui_StatusRegister1 ) & 0x8) == 0x8))//Test if warning relay interrupt { /**********************************/ /* Disable the temperature warning */ /**********************************/ ui_ReadCommand = inl (devpriv->iobase+128 + 12); ui_ReadCommand = ui_ReadCommand & 0xFFDF0000UL; outl(ui_ReadCommand , devpriv->iobase+128 + 12); /***************************/ /* Read the channel number */ /***************************/ ui_ChannelNumber = inl(devpriv->iobase+128 + 60); /**************************************/ /* Read the digital temperature value */ /**************************************/ ui_DigitalTemperature = inl(devpriv->iobase+128 + 60); send_sig(SIGIO,devpriv->tsk_Current,0); // send signal to the sample }//if (((ui_StatusRegister1 & 0x8) == 0x8)) else { if((ui_StatusRegister2 & 0x1) == 0x1) { send_sig(SIGIO,devpriv->tsk_Current,0); // send signal to the sample } }//else if (((ui_StatusRegister1 & 0x8) == 0x8)) return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -