📄 hwdrv_apci3501.c
字号:
outl(ul_Command1,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG);//mode 2 }//end if(data[0]==ADDIDATA_TIMER)return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : int i_APCI3501_StartStopWriteTimerCounterWatchdog || (comedi_device *dev,comedi_subdevice *s, | | comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Start / Stop The Selected Timer , Counter or Watchdog |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || UINT *data : Data Pointer contains || configuration parameters as below || | | data[0] : 0 Timer | | 1 Counter | | 2 Watchdog | | data[1] : 1 Start | | 0 Stop | 2 Trigger |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/int i_APCI3501_StartStopWriteTimerCounterWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){ULONG ul_Command1 = 0;int i_Temp;if (devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG) { if (data[1]==1) { ul_Command1=inl(devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); ul_Command1=(ul_Command1& 0xFFFFF9FFUL) | 0x1UL; //Enable the Watchdog outl(ul_Command1,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); } else if(data[1]==0)//Stop The Watchdog { //Stop The Watchdog ul_Command1=inl(devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); ul_Command1 =ul_Command1 & 0xFFFFF9FEUL; outl(0x0,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); } else if(data[1]==2) { ul_Command1=inl(devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); ul_Command1 = (ul_Command1 & 0xFFFFF9FFUL) | 0x200UL; outl(ul_Command1,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); }//if(data[1]==2) } // end if (devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG)if (devpriv->b_TimerSelectMode==ADDIDATA_TIMER) { if (data[1]==1) { ul_Command1=inl(devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); ul_Command1=(ul_Command1& 0xFFFFF9FFUL) | 0x1UL; //Enable the Timer outl(ul_Command1,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); } else if(data[1]==0) { //Stop The Timer ul_Command1=inl(devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); ul_Command1 =ul_Command1 & 0xFFFFF9FEUL; outl(ul_Command1,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); } else if (data[1]==2) { //Trigger the Timer ul_Command1=inl(devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); ul_Command1 = (ul_Command1 & 0xFFFFF9FFUL) | 0x200UL; outl(ul_Command1,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); } } // end if (devpriv->b_TimerSelectMode==ADDIDATA_TIMER)i_Temp= inl(devpriv->iobase + APCI3501_WATCHDOG + APCI3501_TCW_TRIG_STATUS)&0x1; return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : int i_APCI3501_ReadTimerCounterWatchdog || (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 || | | data[0] : 0 Timer | | 1 Counter | | 2 Watchdog | | data[1] : Timer Counter Watchdog Number |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/int i_APCI3501_ReadTimerCounterWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){ if (devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG) { data[0]= inl(devpriv->iobase + APCI3501_WATCHDOG + APCI3501_TCW_TRIG_STATUS)&0x1; data[1]= inl(devpriv->iobase + APCI3501_WATCHDOG); }// end if (devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG) else if (devpriv->b_TimerSelectMode==ADDIDATA_TIMER) { data[0]= inl(devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_TRIG_STATUS)&0x1; data[1]= inl(devpriv->iobase + APCI3501_WATCHDOG); } // end if (devpriv->b_TimerSelectMode==ADDIDATA_TIMER) else if ((devpriv->b_TimerSelectMode!=ADDIDATA_TIMER) && (devpriv->b_TimerSelectMode!=ADDIDATA_WATCHDOG)) { printk ("\nIn ReadTimerCounterWatchdog :: Invalid Subdevice \n"); }return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : int i_APCI3501_Reset(comedi_device *dev) || |+----------------------------------------------------------------------------+| Task :Resets the registers of the card |+----------------------------------------------------------------------------+| Input Parameters : |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : || |+----------------------------------------------------------------------------+*/int i_APCI3501_Reset(comedi_device *dev){int i_Count=0,i_temp=0;ULONG ul_Command1 = 0,ul_Polarity,ul_DAC_Ready=0;outl(0x0,devpriv->iobase+APCI3501_DIGITAL_OP);outl(1,devpriv->iobase+APCI3501_ANALOG_OUTPUT+APCI3501_AO_VOLT_MODE); ul_Polarity=0x80000000; for(i_Count=0;i_Count<=7;i_Count++) { ul_DAC_Ready=inl(devpriv->iobase+APCI3501_ANALOG_OUTPUT); while(ul_DAC_Ready==0) { ul_DAC_Ready=inl(devpriv->iobase+APCI3501_ANALOG_OUTPUT); ul_DAC_Ready=(ul_DAC_Ready>>8)&1; } if(ul_DAC_Ready) { // Output the Value on the output channels. ul_Command1=(ULONG)((ULONG)(i_Count & 0xFF)|(ULONG)((i_temp << 0x8)&0x7FFFFF00L)|(ULONG)(ul_Polarity)); outl(ul_Command1,devpriv->iobase+APCI3501_ANALOG_OUTPUT+APCI3501_AO_PROG); } } return 0;}/*+----------------------------------------------------------------------------+| Function Name : static void v_APCI3501_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 || |+----------------------------------------------------------------------------+*/ void v_APCI3501_Interrupt(int irq, void *d, struct pt_regs *regs) { int i_temp; comedi_device *dev = d; unsigned int ui_Timer_AOWatchdog ; unsigned long ul_Command1; // Disable Interrupt ul_Command1=inl(devpriv->iobase+APCI3501_WATCHDOG +APCI3501_TCW_PROG); ul_Command1 = (ul_Command1 & 0xFFFFF9FDul); outl(ul_Command1 , devpriv->iobase+APCI3501_WATCHDOG +APCI3501_TCW_PROG); ui_Timer_AOWatchdog=inl(devpriv->iobase+APCI3501_WATCHDOG +APCI3501_TCW_IRQ )& 0x1; if ((!ui_Timer_AOWatchdog)) { comedi_error(dev,"IRQ from unknow source"); return; } // Enable Interrupt //Send a signal to from kernel to user space send_sig(SIGIO,devpriv->tsk_Current,0); ul_Command1=inl(devpriv->iobase+APCI3501_WATCHDOG +APCI3501_TCW_PROG); ul_Command1 = ((ul_Command1 & 0xFFFFF9FDul) | 1 << 1); outl(ul_Command1 , devpriv->iobase+APCI3501_WATCHDOG +APCI3501_TCW_PROG); i_temp= inl(devpriv->iobase + APCI3501_WATCHDOG + APCI3501_TCW_TRIG_STATUS)&0x1; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -