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

📄 hwdrv_apci1564.c

📁 最新版comedi的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
         data[0]=(data[0] << ui_NoOfChannel)|ui_Temp;         outl(data[0],devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP + APCI1564_DIGITAL_OP_RW);           } // if  (data[1]==0)       else         {         if  (data[1]==1)            {             switch (ui_NoOfChannel)	       {               case 2: data[0]=(data[0] << (2*data[2]))|ui_Temp; 	               break;               case 4: data[0]=(data[0] << (4*data[2]))|ui_Temp;             	       break;               case 8: data[0]=(data[0] <<(8*data[2]))|ui_Temp;                         break;               case 16: data[0]=(data[0] <<(16*data[2]))|ui_Temp;                        break;               case 31: data[0]=data[0]|ui_Temp;                         break;               default: comedi_error(dev," chan spec wrong");                        return -EINVAL;   // "sorry channel spec wrong "                 } // switch (ui_NoOfChannels)            outl(data[0],devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP + APCI1564_DIGITAL_OP_RW);            } // if  (data[1]==1)         else            {            printk("\nSpecified channel not supported\n");            } // else if  (data[1]==1)         } // else if (data[1]==0)      }//if(data[3]==0)   else      {      if  (data[3]==1)         {         if  (data[1]==0)            {            data[0]=~data[0]&0x1;            ui_Temp1=1;            ui_Temp1=ui_Temp1<<ui_NoOfChannel;            ui_Temp=ui_Temp|ui_Temp1;              data[0]=(data[0] << ui_NoOfChannel)^0xffffffff;            data[0]=data[0]& ui_Temp;             outl(data[0],devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP + APCI1564_DIGITAL_OP_RW);              } // if  (data[1]==0)          else            {            if  (data[1]==1)               {                switch (ui_NoOfChannel)	          {         	  case 2: data[0]=~data[0]&0x3;                           ui_Temp1=3;                          ui_Temp1=ui_Temp1<<2*data[2];                          ui_Temp=ui_Temp|ui_Temp1;                             data[0]=((data[0] << (2*data[2]))^0xffffffff)& ui_Temp; 	                  break;        	  case 4: data[0]=~data[0]&0xf;                          ui_Temp1=15;                          ui_Temp1=ui_Temp1<<4*data[2];                          ui_Temp=ui_Temp|ui_Temp1;                              data[0]=((data[0] << (4*data[2]))^0xffffffff)&ui_Temp;	                  break;                  case 8: data[0]=~data[0]&0xff;                          ui_Temp1=255;                          ui_Temp1=ui_Temp1<<8*data[2];                          ui_Temp=ui_Temp|ui_Temp1;                              data[0]=((data[0] << (8*data[2]))^0xffffffff)&ui_Temp;  	                  break;                  case 16: data[0]=~data[0]&0xffff;                           ui_Temp1=65535;                           ui_Temp1=ui_Temp1<<16*data[2];                           ui_Temp=ui_Temp|ui_Temp1;                               data[0]=((data[0] << (16*data[2]))^0xffffffff)&ui_Temp;  	                   break;                  case 31: break;                  default: comedi_error(dev," chan spec wrong");                           return -EINVAL;   // "sorry channel spec wrong "                    }//switch(ui_NoOfChannels)               outl(data[0],devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP + APCI1564_DIGITAL_OP_RW);               } // if  (data[1]==1)            else               {               printk("\nSpecified channel not supported\n");               } // else if  (data[1]==1)            } // else if  (data[1]==0)         } // if  (data[3]==1);      else         {         printk("\nSpecified functionality does not exist\n");         return -EINVAL;         } // else if (data[3]==1)      } // else if (data[3]==0)    return insn->n;}/*+----------------------------------------------------------------------------+| Function   Name   : int i_APCI1564_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_APCI1564_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->i_IobaseAmcc+APCI1564_DIGITAL_OP+APCI1564_DIGITAL_OP_RW);   if  (ui_Temp==0)      {      *data=(*data >> ui_NoOfChannel)&0x1;       } // if  (ui_Temp==0)   else      {      if  (ui_Temp==1)         {         switch (ui_NoOfChannel)	   {           case 2:                     *data=(*data >>(2*data[1]))&3;                     break;           case 4:                     *data=(*data >>(4*data[1]))&15; 	            break; 	   case 8:  	            *data=(*data >>(8*data[1]))&255;                      break;            case 16:                     *data=(*data >>(16*data[1]))&65535;                    break;           case 31: break;           default:	            comedi_error(dev," chan spec wrong");		    return -EINVAL;   // "sorry channel spec wrong "                      break;           } // switch(ui_NoOfChannels)            } // 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_APCI1564_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			     |                            |					  data[4]            : Timer Mode             	 |                            |					  data[5]			 : Timer Counter Watchdog Number|                                   data[6]            :  Counter Direction +----------------------------------------------------------------------------+| Output Parameters :	--													 |+----------------------------------------------------------------------------+| Return Value      : TRUE  : No error occur                                 ||		            : FALSE : Error occur. Return the error          ||			                                                         |+----------------------------------------------------------------------------+*/INT i_APCI1564_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->i_IobaseAmcc+ APCI1564_DIGITAL_OP_WATCHDOG+ APCI1564_TCW_PROG);      //Loading the Reload value      outl(data[3],devpriv->i_IobaseAmcc+APCI1564_DIGITAL_OP_WATCHDOG+APCI1564_TCW_RELOAD_VALUE);        } // if  (data[0]==ADDIDATA_WATCHDOG)   else if  (data[0]==ADDIDATA_TIMER)      {      //First Stop The Timer       ul_Command1 =inl(devpriv->i_IobaseAmcc+ APCI1564_TIMER+ APCI1564_TCW_PROG);      ul_Command1 =ul_Command1 & 0xFFFFF9FEUL;      outl(ul_Command1,devpriv->i_IobaseAmcc+ APCI1564_TIMER+ APCI1564_TCW_PROG);//Stop The Timer      devpriv->b_TimerSelectMode =ADDIDATA_TIMER;      if  (data[1]==1)         {          outl(0x02,devpriv->i_IobaseAmcc+ APCI1564_TIMER+ APCI1564_TCW_PROG);//Enable TIMER int & DISABLE ALL THE OTHER int SOURCES         outl(0x0,devpriv->i_IobaseAmcc + APCI1564_DIGITAL_IP + APCI1564_DIGITAL_IP_IRQ);         outl(0x0,devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP + APCI1564_DIGITAL_OP_IRQ);          outl(0x0,devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP_WATCHDOG + APCI1564_TCW_IRQ);         outl(0x0,devpriv->iobase+APCI1564_COUNTER1 + APCI1564_TCW_IRQ);         outl(0x0,devpriv->iobase+APCI1564_COUNTER2 + APCI1564_TCW_IRQ);         outl(0x0,devpriv->iobase+APCI1564_COUNTER3 + APCI1564_TCW_IRQ);         outl(0x0,devpriv->iobase+APCI1564_COUNTER4 + APCI1564_TCW_IRQ);         } // if  (data[1]==1)      else         {          outl(0x0,devpriv->i_IobaseAmcc+ APCI1564_TIMER+ APCI1564_TCW_PROG);//disable Timer interrupt         } // else if  (data[1]==1)          // Loading Timebase              outl(data[2],devpriv->i_IobaseAmcc+APCI1564_TIMER+APCI1564_TCW_TIMEBASE);              //Loading the Reload value      outl(data[3],devpriv->i_IobaseAmcc+APCI1564_TIMER+APCI1564_TCW_RELOAD_VALUE);          ul_Command1 =inl(devpriv->i_IobaseAmcc+ APCI1564_TIMER+ APCI1564_TCW_PROG);      ul_Command1 = (ul_Command1 & 0xFFF719E2UL) |  2UL << 13UL | 0x10UL;      outl(ul_Command1,devpriv->i_IobaseAmcc+ APCI1564_TIMER+ APCI1564_TCW_PROG);//mode 2      } // else if  (data[0]==ADDIDATA_TIMER)   else if  (data[0]==ADDIDATA_COUNTER)      {      devpriv->b_TimerSelectMode =ADDIDATA_COUNTER;      devpriv->b_ModeSelectRegister=data[5];      //First Stop The Counter      ul_Command1 =inl(devpriv->iobase+((data[5]-1)*0x20)+APCI1564_TCW_PROG);       ul_Command1 =ul_Command1 & 0xFFFFF9FEUL;      outl(ul_Command1,devpriv->iobase+((data[5]-1)*0x20)+APCI1564_TCW_PROG);//Stop The Timer      /************************/      /* Set the reload value */      /************************/      outl(data[3] , devpriv->iobase+((data[5]-1)*0x20)+APCI1564_TCW_RELOAD_VALUE);       /******************************/      /* Set the mode :             */      /* - Disable the hardware     */      /* - Disable the counter mode */      /* - Disable the warning      */      /* - Disable the reset        */      /* - Disable the timer mode   */      /* - Enable the counter mode  */      /******************************/      ul_Command1 = (ul_Command1 & 0xFFFC19E2UL) | 0x80000UL | (ULONG) ((ULONG) data[4] << 16UL);      outl(ul_Command1 , devpriv->iobase+((data[5]-1)*0x20)+APCI1564_TCW_PROG);       // Enable or Disable Interrupt       ul_Command1= (ul_Command1 & 0xFFFFF9FD) | (data[1] << 1); 		       outl(ul_Command1 , devpriv->iobase+((data[5]-1)*0x20)+APCI1564_TCW_PROG);       /*****************************/      /* Set the Up/Down selection */      /*****************************/      ul_Command1 = (ul_Command1 & 0xFFFBF9FFUL) |  (data[6] << 18);      outl(ul_Command1 , devpriv->iobase+((data[5]-1)*0x20)+APCI1564_TCW_PROG);        } // else if  (data[0]==ADDIDATA_COUNTER)   else         {      printk(" Invalid subdevice.");      } // else if  (data[0]==ADDIDATA_WATCHDOG)       return insn->n;}/*+----------------------------------------------------------------------------+| Function   Name   : int i_APCI1564_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             	 |	|                                                    Clear (Only Counter)    |+----------------------------------------------------------------------------+| Output Parameters :	--													 |+----------------------------------------------------------------------------+| Return Value      : TRUE  : No error occur                                 ||		            : FALSE : Error occur. Return the error          ||			                                                         |+----------------------------------------------------------------------------+*/INT i_APCI1564_StartStopWriteTimerCounterWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){   ULONG  ul_Command1 = 0;    if  (devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG)      {      switch (data[1])

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -