📄 hwdrv_apci3xxx.c
字号:
| Task : Reads the value of the Digital input Port i.e.4channels|+----------------------------------------------------------------------------+| Input Parameters : - |+----------------------------------------------------------------------------+| Output Parameters : data[0] : Port value |+----------------------------------------------------------------------------+| Return Value :>0: No error || .... || -101 : Data size error |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnBitsDigitalInput (comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { INT i_ReturnValue = insn->n; DWORD dw_Temp = 0; /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 1) { dw_Temp= inl (devpriv->iobase + 32); *data= dw_Temp & 0xf; } else { /*******************/ /* Data size error */ /*******************/ printk("Buffer size error\n"); i_ReturnValue = -101; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| DIGITAL OUTPUT SUBDEVICE |+----------------------------------------------------------------------------+*//*+----------------------------------------------------------------------------+| Function name :int i_APCI3XXX_InsnBitsDigitalOutput || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Write the selected output mask and read the status from| | all digital output channles |+----------------------------------------------------------------------------+| Input Parameters : dw_ChannelMask = data [0]; || dw_BitMask = data [1]; |+----------------------------------------------------------------------------+| Output Parameters : data[1] : All digital output channles states |+----------------------------------------------------------------------------+| Return Value : >0 : No error || -4 : Channel mask error || -101 : Data size error |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnBitsDigitalOutput (comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { INT i_ReturnValue = insn->n; BYTE b_ChannelCpt = 0; DWORD dw_ChannelMask = 0; DWORD dw_BitMask = 0; DWORD dw_Status = 0; /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 2) { /*******************************/ /* Get the channe and bit mask */ /*******************************/ dw_ChannelMask = data [0]; dw_BitMask = data [1]; /*************************/ /* Test the channel mask */ /*************************/ if ((dw_ChannelMask & 0XFFFFFFF0) == 0) { /*********************************/ /* Test if set/reset any channel */ /*********************************/ if (dw_ChannelMask & 0xF) { /********************************/ /* Read the digital output port */ /********************************/ dw_Status = inl(devpriv->iobase + 48); for (b_ChannelCpt = 0; b_ChannelCpt < 4; b_ChannelCpt ++) { if ((dw_ChannelMask >> b_ChannelCpt) & 1) { dw_Status = (dw_Status & (0xF - (1 << b_ChannelCpt))) | (dw_BitMask & (1 << b_ChannelCpt)); } } outl (dw_Status, devpriv->iobase + 48); } /********************************/ /* Read the digital output port */ /********************************/ data [1] = inl(devpriv->iobase + 48); } else { /************************/ /* Config command error */ /************************/ printk("Channel mask error\n"); i_ReturnValue = -4; } } else { /*******************/ /* Data size error */ /*******************/ printk("Buffer size error\n"); i_ReturnValue = -101; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function name :int i_APCI3XXX_InsnWriteDigitalOutput || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Set the state from digital output channel |+----------------------------------------------------------------------------+| Input Parameters : b_Channel = CR_CHAN(insn->chanspec) || b_State = data [0] |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : >0 : No error || -3 : Channel selection error || -101 : Data size error |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnWriteDigitalOutput (comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { INT i_ReturnValue = insn->n; BYTE b_Channel = CR_CHAN(insn->chanspec); BYTE b_State = 0; DWORD dw_Status = 0; /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 1) { /***************************/ /* Test the channel number */ /***************************/ if(b_Channel < devpriv->ps_BoardInfo->i_NbrDoChannel) { /*******************/ /* Get the command */ /*******************/ b_State = (BYTE) data[0]; /********************************/ /* Read the digital output port */ /********************************/ dw_Status = inl(devpriv->iobase + 48); dw_Status = (dw_Status & (0xF - (1 << b_Channel))) | ((b_State & 1) << b_Channel); outl (dw_Status, devpriv->iobase + 48); } else { /***************************/ /* Channel selection error */ /***************************/ printk("Channel selection error\n"); i_ReturnValue = -3; } } else { /*******************/ /* Data size error */ /*******************/ printk("Buffer size error\n"); i_ReturnValue = -101; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function name :int i_APCI3XXX_InsnReadDigitalOutput || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Read the state from digital output channel |+----------------------------------------------------------------------------+| Input Parameters : b_Channel = CR_CHAN(insn->chanspec) |+----------------------------------------------------------------------------+| Output Parameters : b_State = data [0] |+----------------------------------------------------------------------------+| Return Value : >0 : No error || -3 : Channel selection error || -101 : Data size error |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnReadDigitalOutput (comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { INT i_ReturnValue = insn->n; BYTE b_Channel = CR_CHAN(insn->chanspec); DWORD dw_Status = 0; /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 1) { /***************************/ /* Test the channel number */ /***************************/ if(b_Channel < devpriv->ps_BoardInfo->i_NbrDoChannel) { /********************************/ /* Read the digital output port */ /********************************/ dw_Status = inl(devpriv->iobase + 48); dw_Status = (dw_Status >> b_Channel) & 1; *data = dw_Status; } else { /***************************/ /* Channel selection error */ /***************************/ printk("Channel selection error\n"); i_ReturnValue = -3; } } else { /*******************/ /* Data size error */ /*******************/ printk("Buffer size error\n"); i_ReturnValue = -101; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function Name : int i_APCI3XXX_Reset(comedi_device *dev) | +----------------------------------------------------------------------------+| Task :resets all the registers |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : - |+----------------------------------------------------------------------------+*/ int i_APCI3XXX_Reset(comedi_device *dev) { unsigned char b_Cpt = 0; /*************************/ /* Disable the interrupt */ /*************************/ disable_irq(dev->irq); /****************************/ /* Reset the interrupt flag */ /****************************/ devpriv->b_EocEosInterrupt = 0; /***************************/ /* Clear the start command */ /***************************/ writel (0, (void *) (devpriv->dw_AiBase + 8)); /*****************************/ /* Reset the interrupt flags */ /***
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -