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

📄 hwdrv_apci1564.c

📁 最新版comedi的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
         {         case 0:  //stop the watchdog                  outl(0x0,devpriv->i_IobaseAmcc+ APCI1564_DIGITAL_OP_WATCHDOG+ APCI1564_TCW_PROG );//disable the watchdog                  break;         case 1:  //start the watchdog                  outl(0x0001,devpriv->i_IobaseAmcc+ APCI1564_DIGITAL_OP_WATCHDOG+ APCI1564_TCW_PROG);                  break;         case 2:  //Software trigger                    outl(0x0201,devpriv->i_IobaseAmcc+ APCI1564_DIGITAL_OP_WATCHDOG+ APCI1564_TCW_PROG);                  break;         default: printk("\nSpecified functionality does not exist\n");	          return -EINVAL;         }  // switch (data[1])              } // if  (devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG)      if  (devpriv->b_TimerSelectMode==ADDIDATA_TIMER)      {      if  (data[1]==1)          {          ul_Command1=inl(devpriv->i_IobaseAmcc+ APCI1564_TIMER+ APCI1564_TCW_PROG);         ul_Command1=(ul_Command1& 0xFFFFF9FFUL) | 0x1UL;                //Enable the Timer         outl(ul_Command1,devpriv->i_IobaseAmcc+ APCI1564_TIMER+ APCI1564_TCW_PROG);         } // if  (data[1]==1)      else if(data[1]==0)         {         //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);         } // else if(data[1]==0)      } // if  (devpriv->b_TimerSelectMode==ADDIDATA_TIMER)   if  (devpriv->b_TimerSelectMode==ADDIDATA_COUNTER)      {      ul_Command1=inl(devpriv->iobase+((devpriv->b_ModeSelectRegister-1)*0x20)+APCI1564_TCW_PROG);      if  (data[1] == 1)          {         //Start the Counter subdevice          ul_Command1= (ul_Command1 & 0xFFFFF9FFUL) | 0x1UL;         } // if  (data[1] == 1)      else if (data[1] == 0)         {         // Stops the Counter subdevice 	 ul_Command1 = 0;                  } // else if  (data[1] == 0)      else if (data[1] == 2)         {         // Clears the Counter subdevice         ul_Command1= (ul_Command1 & 0xFFFFF9FFUL)|0x400;         } // else if  (data[1] == 3)      outl(ul_Command1 , devpriv->iobase+((devpriv->b_ModeSelectRegister-1)*0x20)+APCI1564_TCW_PROG);      } // if (devpriv->b_TimerSelectMode==ADDIDATA_COUNTER)   return insn->n;}/*+----------------------------------------------------------------------------+| Function   Name   : int i_APCI1564_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 ||                                                                            | 					+----------------------------------------------------------------------------+| Output Parameters :	--													 |+----------------------------------------------------------------------------+| Return Value      : TRUE  : No error occur                                 ||		            : FALSE : Error occur. Return the error          ||			                                                         |+----------------------------------------------------------------------------+*/INT i_APCI1564_ReadTimerCounterWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){   ULONG  ul_Command1 = 0;    if  (devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG)      {       // Stores the status of the Watchdog       data[0]= inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP_WATCHDOG + APCI1564_TCW_TRIG_STATUS)&0x1;      data[1]= inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP_WATCHDOG);      } // if  (devpriv->b_TimerSelectMode==ADDIDATA_WATCHDOG)   else if  (devpriv->b_TimerSelectMode==ADDIDATA_TIMER)       {      // Stores the status of the Timer       data[0]= inl(devpriv->i_IobaseAmcc+APCI1564_TIMER+APCI1564_TCW_TRIG_STATUS)&0x1;       // Stores the Actual value of the Timer       data[1]= inl(devpriv->i_IobaseAmcc + APCI1564_TIMER);       }  // else if  (devpriv->b_TimerSelectMode==ADDIDATA_TIMER)   else  if  (devpriv->b_TimerSelectMode==ADDIDATA_COUNTER)       {      // Read the Counter Actual Value.       data[0] = inl(devpriv->iobase+((devpriv->b_ModeSelectRegister-1)*0x20)+APCI1564_TCW_SYNC_ENABLEDISABLE);      ul_Command1 =  inl(devpriv->iobase+((devpriv->b_ModeSelectRegister-1)*0x20)+APCI1564_TCW_TRIG_STATUS);      /***********************************/      /* Get the software trigger status */      /***********************************/      data[1]= (BYTE) ((ul_Command1 >> 1) & 1);      /***********************************/      /* Get the hardware trigger status */      /***********************************/      data[2]= (BYTE) ((ul_Command1 >> 2) & 1);      /*********************************/      /* Get the software clear status */      /*********************************/      data[3]= (BYTE) ((ul_Command1 >> 3) & 1);      /***************************/      /* Get the overflow status */      /***************************/      data[4]= (BYTE) ((ul_Command1 >> 0) & 1);      } // else  if  (devpriv->b_TimerSelectMode==ADDIDATA_COUNTER)   else if ((devpriv->b_TimerSelectMode!=ADDIDATA_TIMER) && (devpriv->b_TimerSelectMode!=ADDIDATA_WATCHDOG)&& (devpriv->b_TimerSelectMode!=ADDIDATA_COUNTER))     {     printk ("\n Invalid Subdevice !!!\n");     } // else if ((devpriv->b_TimerSelectMode!=ADDIDATA_TIMER) && (devpriv->b_TimerSelectMode!=ADDIDATA_WATCHDOG)&& (devpriv->b_TimerSelectMode!=ADDIDATA_COUNTER))   return insn->n;}/*+----------------------------------------------------------------------------+| Function   Name   :  int i_APCI1564_ReadInterruptStatus                    ||			  (comedi_device *dev,comedi_subdevice *s,               | |                      comedi_insn *insn,lsampl_t *data)                     |+----------------------------------------------------------------------------+| Task              :Reads the interrupt status register                     |+----------------------------------------------------------------------------+| Input Parameters  :                                                        |+----------------------------------------------------------------------------+| Output Parameters :	--													 |+----------------------------------------------------------------------------+| Return Value      :                                                        ||			                                                         |+----------------------------------------------------------------------------+*/int i_APCI1564_ReadInterruptStatus(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){      *data=ui_Type;    return insn->n;} /*+----------------------------------------------------------------------------+| Function   Name   : static void v_APCI1564_Interrupt					     ||					  (int irq , void *d, struct pt_regs *regs)      |+----------------------------------------------------------------------------+| Task              : Interrupt handler for the interruptible digital inputs |+----------------------------------------------------------------------------+| 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_APCI1564_Interrupt(int irq,void* d, struct pt_regs *regs) {   comedi_device *dev =d; 	   UINT ui_DO, ui_DI;   UINT ui_Timer;   UINT ui_C1, ui_C2, ui_C3, ui_C4;   ULONG ul_Command2=0;    ui_DI       = inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_IP + APCI1564_DIGITAL_IP_IRQ) & 0x01;   ui_DO       = inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP + APCI1564_DIGITAL_OP_IRQ) & 0x01;   ui_Timer    = inl(devpriv->i_IobaseAmcc + APCI1564_TIMER+ APCI1564_TCW_IRQ) & 0x01;    ui_C1=inl(devpriv->iobase + APCI1564_COUNTER1 + APCI1564_TCW_IRQ ) & 0x1;   ui_C2=inl(devpriv->iobase + APCI1564_COUNTER2 + APCI1564_TCW_IRQ ) & 0x1;   ui_C3=inl(devpriv->iobase + APCI1564_COUNTER3 + APCI1564_TCW_IRQ ) & 0x1;   ui_C4=inl(devpriv->iobase + APCI1564_COUNTER4 + APCI1564_TCW_IRQ ) & 0x1;  if(ui_DI==0 && ui_DO==0 && ui_Timer==0 && ui_C1==0 && ui_C2==0 && ui_C3==0 && ui_C4==0)      {       printk("\nInterrupt from unknown source\n");      }// if(ui_DI==0 && ui_DO==0 && ui_Timer==0 && ui_C1==0 && ui_C2==0 && ui_C3==0 && ui_C4==0)         if  (ui_DI == 1)      {      ui_DI = inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_IP + APCI1564_DIGITAL_IP_IRQ);      outl(0x0 ,devpriv->i_IobaseAmcc + APCI1564_DIGITAL_IP + APCI1564_DIGITAL_IP_IRQ);      ui_InterruptStatus_1564=inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_IP + APCI1564_DIGITAL_IP_INTERRUPT_STATUS);      ui_InterruptStatus_1564=ui_InterruptStatus_1564 & 0X000FFFF0;      send_sig(SIGIO,devpriv->tsk_Current,0); // send signal to the sample         outl(ui_DI ,devpriv->i_IobaseAmcc + APCI1564_DIGITAL_IP + APCI1564_DIGITAL_IP_IRQ);//enable the interrupt      return;      }   if  (ui_DO == 1)      {      // Check for Digital Output interrupt Type - 1: Vcc interrupt 2: CC interrupt.      ui_Type=inl(devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP + APCI1564_DIGITAL_OP_INTERRUPT_STATUS) & 0x3;            //Disable the  Interrupt       outl(0x0,devpriv->i_IobaseAmcc + APCI1564_DIGITAL_OP + APCI1564_DIGITAL_OP_INTERRUPT);              //Sends signal to user space 	 send_sig(SIGIO,devpriv->tsk_Current,0);            }  // if  (ui_DO)   if  ((ui_Timer == 1) && (devpriv->b_TimerSelectMode =ADDIDATA_TIMER))      {      // Disable Timer Interrupt       ul_Command2=inl(devpriv->i_IobaseAmcc + APCI1564_TIMER + APCI1564_TCW_PROG);        outl(0x0 , devpriv->i_IobaseAmcc + APCI1564_TIMER + APCI1564_TCW_PROG);      //Send a signal to from kernel to user space      send_sig(SIGIO,devpriv->tsk_Current,0);       // Enable Timer Interrupt            outl(ul_Command2 , devpriv->i_IobaseAmcc + APCI1564_TIMER + APCI1564_TCW_PROG);      } // if  ((ui_Timer == 1) && (devpriv->b_TimerSelectMode =ADDIDATA_TIMER))    if  ((ui_C1 == 1) && (devpriv->b_TimerSelectMode = ADDIDATA_COUNTER))      {      // Disable Counter Interrupt       ul_Command2=inl(devpriv->iobase + APCI1564_COUNTER1 + APCI1564_TCW_PROG);      outl(0x0 , devpriv->iobase + APCI1564_COUNTER1 + APCI1564_TCW_PROG);      //Send a signal to from kernel to user space      send_sig(SIGIO,devpriv->tsk_Current,0);       // Enable Counter Interrupt       outl(ul_Command2 , devpriv->iobase + APCI1564_COUNTER1 + APCI1564_TCW_PROG);      } // if  ((ui_C1 == 1) && (devpriv->b_TimerSelectMode = ADDIDATA_COUNTER))     if  ((ui_C2 == 1) && (devpriv->b_TimerSelectMode =ADDIDATA_COUNTER))      {      // Disable Counter Interrupt      ul_Command2=inl(devpriv->iobase + APCI1564_COUNTER2 + APCI1564_TCW_PROG);       outl(0x0 , devpriv->iobase + APCI1564_COUNTER2 + APCI1564_TCW_PROG);      //Send a signal to from kernel to user space      send_sig(SIGIO,devpriv->tsk_Current,0);       // Enable Counter Interrupt       outl(ul_Command2 , devpriv->iobase + APCI1564_COUNTER2 + APCI1564_TCW_PROG);      } // if  ((ui_C2 == 1) && (devpriv->b_TimerSelectMode =ADDIDATA_COUNTER))    if  ((ui_C3 == 1) && (devpriv->b_TimerSelectMode =ADDIDATA_COUNTER))      {      // Disable Counter Interrupt       ul_Command2=inl(devpriv->iobase + APCI1564_COUNTER3 + APCI1564_TCW_PROG);       outl(0x0 , devpriv->iobase + APCI1564_COUNTER3 + APCI1564_TCW_PROG);      //Send a signal to from kernel to user space      send_sig(SIGIO,devpriv->tsk_Current,0);       // Enable Counter Interrupt       outl(ul_Command2 , devpriv->iobase + APCI1564_COUNTER3 + APCI1564_TCW_PROG);      } // if ((ui_C3 == 1) && (devpriv->b_TimerSelectMode =ADDIDATA_COUNTER))    if ((ui_C4 == 1) && (devpriv->b_TimerSelectMode =ADDIDATA_COUNTER))      {      // Disable Counter Interrupt       ul_Command2=inl(devpriv->iobase + APCI1564_COUNTER4 + APCI1564_TCW_PROG);         outl(0x0 , devpriv->iobase + APCI1564_COUNTER4 + APCI1564_TCW_PROG);      //Send a signal to from kernel to user space      send_sig(SIGIO,devpriv->tsk_Current,0);       // Enable Counter Interrupt       outl(ul_Command2 , devpriv->iobase + APCI1564_COUNTER4 + APCI1564_TCW_PROG);      } // if ((ui_C4 == 1) && (devpriv->b_TimerSelectMode =ADDIDATA_COUNTER))   return;}	  	  /*+----------------------------------------------------------------------------+| Function   Name   : int i_APCI1564_Reset(comedi_device *dev)               |                                                       |+----------------------------------------------------------------------------+| Task              :resets all the registers                                |+----------------------------------------------------------------------------+| Input Parameters  : comedi_device *dev+----------------------------------------------------------------------------+| Output Parameters :	--													 |+----------------------------------------------------------------------------+| Return Value      :                                                        ||			                                                         |+----------------------------------------------------------------------------+*/	  INT i_APCI1564_Reset(comedi_device *dev) {   outl(0x0 ,devpriv->i_IobaseAmcc+APCI1564_DIGITAL_IP_IRQ);//disable the interrupts   inl(devpriv->i_IobaseAmcc+APCI1564_DIGITAL_IP_INTERRUPT_STATUS);//Reset the interrupt status register	     outl (0x0 , devpriv->i_IobaseAmcc+APCI1564_DIGITAL_IP_INTERRUPT_MODE1);//Disable the and/or interrupt   outl (0x0 , devpriv->i_IobaseAmcc+APCI1564_DIGITAL_IP_INTERRUPT_MODE2);   devpriv->b_DigitalOutputRegister=0;   ui_Type=0;   outl(0x0,devpriv->i_IobaseAmcc+APCI1564_DIGITAL_OP);//Resets the output channels   outl(0x0,devpriv->i_IobaseAmcc+APCI1564_DIGITAL_OP_INTERRUPT);//Disables the interrupt.   outl(0x0,devpriv->i_IobaseAmcc+APCI1564_DIGITAL_OP_WATCHDOG+APCI1564_TCW_RELOAD_VALUE);     outl(0x0,devpriv->i_IobaseAmcc+APCI1564_TIMER);   outl(0x0 , devpriv->i_IobaseAmcc + APCI1564_TIMER + APCI1564_TCW_PROG);   outl(0x0 , devpriv->iobase + APCI1564_COUNTER1 + APCI1564_TCW_PROG);   outl(0x0 , devpriv->iobase + APCI1564_COUNTER2 + APCI1564_TCW_PROG);   outl(0x0 , devpriv->iobase + APCI1564_COUNTER3 + APCI1564_TCW_PROG);   outl(0x0 , devpriv->iobase + APCI1564_COUNTER4 + APCI1564_TCW_PROG);   return 0;}        

⌨️ 快捷键说明

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