⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwdrv_apci3501.c

📁 最新版comedi的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*+----------------------------------------------------------------------------+| 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 + -