📄 hwdrv_apci3501.c
字号:
/*+----------------------------------------------------------------------------+| Function Name : int i_APCI3501_ReadDigitalOutput || (comedi_device *dev,comedi_subdevice *s, | | comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Read value of the selected channel or port |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || UINT ui_NoOfChannels : No Of Channels To read || UINT *data : Data Pointer to read status |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI3501_ReadDigitalOutput(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) { UINT ui_Temp; UINT ui_NoOfChannel; ui_NoOfChannel=CR_CHAN(insn->chanspec); ui_Temp=data[0]; *data=inl(devpriv->iobase+APCI3501_DIGITAL_OP); if (ui_Temp==0) { *data=(*data >> ui_NoOfChannel)&0x1; } // if (ui_Temp==0) else { if (ui_Temp==1) { *data=*data & 0x3; } // if (ui_Temp==1) else { printk("\nSpecified channel not supported \n"); } // else if (ui_Temp==1) } // else if (ui_Temp==0) return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : int i_APCI3501_ConfigAnalogOutput || (comedi_device *dev,comedi_subdevice *s, | | comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Configures The Analog Output 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] : Voltage Mode | | 0:Mode 0 || 1:Mode 1 | | | +----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI3501_ConfigAnalogOutput(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) { outl(data[0],devpriv->iobase+APCI3501_ANALOG_OUTPUT+APCI3501_AO_VOLT_MODE); if(data[0]) { devpriv->b_InterruptMode=MODE1; } else { devpriv->b_InterruptMode=MODE0; } return insn->n;} /*+----------------------------------------------------------------------------+| Function Name : int i_APCI3501_WriteAnalogOutput || (comedi_device *dev,comedi_subdevice *s, | | comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Writes To the Selected Anlog Output Channel |+----------------------------------------------------------------------------+| 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 || | | | +----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI3501_WriteAnalogOutput(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) {ULONG ul_Command1 = 0,ul_Channel_no,ul_Polarity,ul_DAC_Ready=0;; ul_Channel_no=CR_CHAN(insn->chanspec);if(devpriv->b_InterruptMode==MODE1) { ul_Polarity=0x80000000; if((*data<0) || (*data>16384)) { printk("\nIn WriteAnalogOutput :: Not Valid Data\n"); } } // end if(devpriv->b_InterruptMode==MODE1)else { ul_Polarity=0; if((*data<0) || (*data>8192)) { printk("\nIn WriteAnalogOutput :: Not Valid Data\n"); } }// end else if((ul_Channel_no<0)||(ul_Channel_no>7)) { printk("\nIn WriteAnalogOutput :: Not Valid Channel\n"); } // end if((ul_Channel_no<0)||(ul_Channel_no>7))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)(ul_Channel_no & 0xFF)|(ULONG)((*data << 0x8)&0x7FFFFF00L)|(ULONG)(ul_Polarity));outl(ul_Command1,devpriv->iobase+APCI3501_ANALOG_OUTPUT+APCI3501_AO_PROG);}return insn->n;} /*+----------------------------------------------------------------------------+| Function Name : int i_APCI3501_ConfigTimerCounterWatchdog || (comedi_device *dev,comedi_subdevice *s, | | comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Configures The Timer , Counter or Watchdog |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || UINT *data : Data Pointer contains || configuration parameters as below || | | data[0] : 0 Configure As Timer | | 1 Configure As Counter | | 2 Configure As Watchdog | | data[1] : 1 Enable Interrupt | | 0 Disable Interrupt | | data[2] : Time Unit || data[3] : Reload Value | +----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI3501_ConfigTimerCounterWatchdog (comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) { ULONG ul_Command1 = 0;devpriv->tsk_Current=current; if (data[0]==ADDIDATA_WATCHDOG) { devpriv->b_TimerSelectMode = ADDIDATA_WATCHDOG; //Disable the watchdog outl(0x0,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); //disable Wa if (data[1]==1) { //Enable TIMER int & DISABLE ALL THE OTHER int SOURCES outl(0x02,devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_PROG); } else { outl(0x0,devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_PROG);//disable Timer interrupt } //Loading the Timebase value outl(data[2],devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_TIMEBASE); //Loading the Reload value outl(data[3],devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_RELOAD_VALUE); //Set the mode ul_Command1 = inl(devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_PROG) | 0xFFF819E0UL;//e2->e0 outl(ul_Command1 , devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_PROG); }//end if(data[0]==ADDIDATA_WATCHDOG) else if (data[0]==ADDIDATA_TIMER) { //First 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);//Stop The Timer devpriv->b_TimerSelectMode =ADDIDATA_TIMER; if (data[1]==1) { //Enable TIMER int & DISABLE ALL THE OTHER int SOURCES outl(0x02,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); } else { outl(0x0,devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG);//disable Timer interrupt } // Loading Timebase outl(data[2],devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_TIMEBASE); //Loading the Reload value outl(data[3],devpriv->iobase+APCI3501_WATCHDOG+APCI3501_TCW_RELOAD_VALUE); // printk ("\nTimer Address :: %x\n", (devpriv->iobase+APCI3501_WATCHDOG)); ul_Command1 =inl(devpriv->iobase+ APCI3501_WATCHDOG+ APCI3501_TCW_PROG); ul_Command1 = (ul_Command1 & 0xFFF719E2UL) | 2UL << 13UL | 0x10UL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -