📄 hwdrv_apci2032.c
字号:
| : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI2032_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+APCI2032_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 " }//switch(ui_NoOfChannels) }//if (ui_Temp==1) else { printk("\nSpecified channel not supported \n"); }//elseif (ui_Temp==1) }return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : INT i_APCI2032_ConfigWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)|| |+----------------------------------------------------------------------------+| Task : Configures The Watchdog |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || comedi_subdevice *s, :pointer to subdevice structure comedi_insn *insn :pointer to insn structure || lsampl_t *data : Data Pointer to read status | +----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/INT i_APCI2032_ConfigWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){if(data[0]==0) { //Disable the watchdog outl(0x0,devpriv->iobase+APCI2032_DIGITAL_OP_WATCHDOG+APCI2032_TCW_PROG); //Loading the Reload value outl(data[1],devpriv->iobase+APCI2032_DIGITAL_OP_WATCHDOG+APCI2032_TCW_RELOAD_VALUE); }else { printk("\nThe input parameters are wrong\n"); return -EINVAL; }return insn->n;} /*+----------------------------------------------------------------------------+| Function Name : int i_APCI2032_StartStopWriteWatchdog || (comedi_device *dev,comedi_subdevice *s, comedi_insn *insn,lsampl_t *data); |+----------------------------------------------------------------------------+| Task : Start / Stop The Watchdog |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || comedi_subdevice *s, :pointer to subdevice structure comedi_insn *insn :pointer to insn structure || lsampl_t *data : Data Pointer to read status |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/int i_APCI2032_StartStopWriteWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) { switch(data[0]) { case 0://stop the watchdog outl(0x0,devpriv->iobase +APCI2032_DIGITAL_OP_WATCHDOG+APCI2032_TCW_PROG );//disable the watchdog break; case 1://start the watchdog outl(0x0001,devpriv->iobase+APCI2032_DIGITAL_OP_WATCHDOG+APCI2032_TCW_PROG); break; case 2://Software trigger outl(0x0201,devpriv->iobase+APCI2032_DIGITAL_OP_WATCHDOG+APCI2032_TCW_PROG); break; default:printk("\nSpecified functionality does not exist\n"); return -EINVAL; } return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : int i_APCI2032_ReadWatchdog || (comedi_device *dev,comedi_subdevice *s,comedi_insn *insn, lsampl_t *data); |+----------------------------------------------------------------------------+| Task : Read The Watchdog |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || comedi_subdevice *s, :pointer to subdevice structure comedi_insn *insn :pointer to insn structure || lsampl_t *data : Data Pointer to read status |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/int i_APCI2032_ReadWatchdog(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) { data[0]= inl(devpriv->iobase+APCI2032_DIGITAL_OP_WATCHDOG+APCI2032_TCW_TRIG_STATUS )&0x1; return insn->n;}/*+----------------------------------------------------------------------------+| Function Name : void v_APCI2032_Interrupt || (int irq , void *d, struct pt_regs *regs) |+----------------------------------------------------------------------------+| Task : Writes port value To the selected port |+----------------------------------------------------------------------------+| 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 || |+----------------------------------------------------------------------------+*/ void v_APCI2032_Interrupt(int irq, void *d, struct pt_regs *regs) { comedi_device *dev = d; unsigned int ui_DO; ui_DO=inl(devpriv->iobase+APCI2032_DIGITAL_OP_IRQ)&0x1;//Check if VCC OR CC interrupt has occured. if(ui_DO==0) { printk("\nInterrupt from unKnown source\n"); }// if(ui_DO==0) if (ui_DO) { // Check for Digital Output interrupt Type - 1: Vcc interrupt 2: CC interrupt. ui_Type=inl(devpriv->iobase+ APCI2032_DIGITAL_OP_INTERRUPT_STATUS)&0x3; outl(0x0,devpriv->iobase+APCI2032_DIGITAL_OP+APCI2032_DIGITAL_OP_INTERRUPT); if (ui_Type==1) { //Sends signal to user space send_sig(SIGIO,devpriv->tsk_Current,0); }// if (ui_Type==1) else { if (ui_Type==2) { // Sends signal to user space send_sig(SIGIO,devpriv->tsk_Current,0); }//if (ui_Type==2) }//else if (ui_Type==1) } //if(ui_DO) return; } /*+----------------------------------------------------------------------------+| Function Name : int i_APCI2032_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_APCI2032_ReadInterruptStatus(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){ *data=ui_Type; return insn->n;} /*+----------------------------------------------------------------------------+| Function Name : int i_APCI2032_Reset(comedi_device *dev) || |+----------------------------------------------------------------------------+| Task :Resets the registers of the card |+----------------------------------------------------------------------------+| Input Parameters : |+----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : || |+----------------------------------------------------------------------------+*/int i_APCI2032_Reset(comedi_device *dev){devpriv->b_DigitalOutputRegister=0;ui_Type=0;outl(0x0,devpriv->iobase+APCI2032_DIGITAL_OP);//Resets the output channelsoutl(0x0,devpriv->iobase+APCI2032_DIGITAL_OP_INTERRUPT);//Disables the interrupt.outl(0x0,devpriv->iobase+APCI2032_DIGITAL_OP_WATCHDOG+APCI2032_TCW_PROG);//disable the watchdogoutl(0x0,devpriv->iobase+APCI2032_DIGITAL_OP_WATCHDOG+APCI2032_TCW_RELOAD_VALUE);//reload=0return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -