📄 hwdrv_apci3xxx.c
字号:
data [1] = data [1] | (inl(devpriv->iobase + 64) << 8); /************************/ /* Test if port 2 input */ /************************/ if ((devpriv->ul_TTLPortConfiguration[0] & 0xFF) == 0) { data [1] = data [1] | (inl(devpriv->iobase + 96) << 16); } else { data [1] = data [1] | (inl(devpriv->iobase + 112) << 16); } } 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_InsnReadTTLIO || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Read the status from selected channel |+----------------------------------------------------------------------------+| Input Parameters : b_Channel = CR_CHAN(insn->chanspec) |+----------------------------------------------------------------------------+| Output Parameters : data[0] : Selected TTL channel state |+----------------------------------------------------------------------------+| Return Value : 0 : No error || -3 : Channel selection error || -101 : Data size error |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnReadTTLIO (comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { BYTE b_Channel = (BYTE) CR_CHAN(insn->chanspec); INT i_ReturnValue = insn->n; lsampl_t * pls_ReadData = data; /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 1) { /***********************/ /* Test if read port 0 */ /***********************/ if (b_Channel < 8) { /*******************************************/ /* Read port 0 (first digital output port) */ /*******************************************/ pls_ReadData [0] = inl(devpriv->iobase + 80); pls_ReadData [0] = (pls_ReadData [0] >> b_Channel) & 1; } else { /***********************/ /* Test if read port 1 */ /***********************/ if ((b_Channel > 7) && (b_Channel < 16)) { /******************************************/ /* Read port 1 (first digital input port) */ /******************************************/ pls_ReadData [0] = inl(devpriv->iobase + 64); pls_ReadData [0] = (pls_ReadData [0] >> (b_Channel - 8)) & 1; } else { /***********************/ /* Test if read port 2 */ /***********************/ if ((b_Channel > 15) && (b_Channel < 24)) { /************************/ /* Test if port 2 input */ /************************/ if ((devpriv->ul_TTLPortConfiguration[0] & 0xFF) == 0) { pls_ReadData [0] = inl(devpriv->iobase + 96); pls_ReadData [0] = (pls_ReadData [0] >> (b_Channel - 16)) & 1; } else { pls_ReadData [0] = inl(devpriv->iobase + 112); pls_ReadData [0] = (pls_ReadData [0] >> (b_Channel - 16)) & 1; } } else { /***************************/ /* Channel selection error */ /***************************/ i_ReturnValue = -3; printk ("Channel %d selection error\n", b_Channel); } } } } else { /*******************/ /* Data size error */ /*******************/ printk("Buffer size error\n"); i_ReturnValue = -101; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| TTL OUTPUT FUNCTIONS |+----------------------------------------------------------------------------+*//*+----------------------------------------------------------------------------+| Function Name : INT i_APCI3XXX_InsnWriteTTLIO || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Set the state from TTL 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_InsnWriteTTLIO (comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { INT i_ReturnValue = insn->n; BYTE b_Channel = (BYTE) CR_CHAN(insn->chanspec); BYTE b_State = 0; DWORD dw_Status = 0; /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 1) { b_State = (BYTE) data [0]; /***********************/ /* Test if read port 0 */ /***********************/ if (b_Channel < 8) { /*****************************************************************************/ /* Read port 0 (first digital output port) and set/reset the selcted channel */ /*****************************************************************************/ dw_Status = inl(devpriv->iobase + 80); dw_Status = (dw_Status & (0xFF - (1 << b_Channel))) | ((b_State & 1) << b_Channel); outl(dw_Status, devpriv->iobase + 80); } else { /***********************/ /* Test if read port 2 */ /***********************/ if ((b_Channel > 15) && (b_Channel < 24)) { /*************************/ /* Test if port 2 output */ /*************************/ if ((devpriv->ul_TTLPortConfiguration[0] & 0xFF) == 0xFF) { /*****************************************************************************/ /* Read port 2 (first digital output port) and set/reset the selcted channel */ /*****************************************************************************/ dw_Status = inl(devpriv->iobase + 112); dw_Status = (dw_Status & (0xFF - (1 << (b_Channel - 16)))) | ((b_State & 1) << (b_Channel - 16)); outl(dw_Status, devpriv->iobase + 112); } else { /***************************/ /* Channel selection error */ /***************************/ i_ReturnValue = -3; printk ("Channel %d selection error\n", b_Channel); } } else { /***************************/ /* Channel selection error */ /***************************/ i_ReturnValue = -3; printk ("Channel %d selection error\n", b_Channel); } } } else { /*******************/ /* Data size error */ /*******************/ printk("Buffer size error\n"); i_ReturnValue = -101; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| DIGITAL INPUT SUBDEVICE |+----------------------------------------------------------------------------+*//*+----------------------------------------------------------------------------+| Function name :int i_APCI3XXX_InsnReadDigitalInput || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Reads the value of the specified Digital input channel |+----------------------------------------------------------------------------+| Input Parameters : b_Channel = CR_CHAN(insn->chanspec) (0 to 3) |+----------------------------------------------------------------------------+| Output Parameters : data[0] : Channel value |+----------------------------------------------------------------------------+| Return Value : 0 : No error || -3 : Channel selection error || -101 : Data size error |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnReadDigitalInput(comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { INT i_ReturnValue = insn->n; BYTE b_Channel = (BYTE) CR_CHAN(insn->chanspec); DWORD dw_Temp = 0; /***************************/ /* Test the channel number */ /***************************/ if(b_Channel <= devpriv->ps_BoardInfo->i_NbrDiChannel) { /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 1) { dw_Temp = inl (devpriv->iobase + 32); *data = (dw_Temp >> b_Channel) & 1; } else { /*******************/ /* Data size error */ /*******************/ printk("Buffer size error\n"); i_ReturnValue = -101; } } else { /***************************/ /* Channel selection error */ /***************************/ printk("Channel selection error\n"); i_ReturnValue = -3; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function name :int i_APCI3XXX_InsnBitsDigitalInput || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -