📄 hwdrv_apci1564.c
字号:
{ 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 + -