📄 hwdrv_apci16xx.c
字号:
{ /*****************/ /* Command error */ /*****************/ printk("\nCommand selection error"); i_ReturnValue = -100; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| OUTPUT FUNCTIONS |+----------------------------------------------------------------------------+*//*+----------------------------------------------------------------------------+| Function Name : INT i_APCI16XX_InsnBitsWriteTTLIO || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Set the state from selected TTL digital output || (b_OutputChannel) |+----------------------------------------------------------------------------+| Task : Set the state from digital output port || (b_SelectedPort) |+----------------------------------------------------------------------------+| Input Parameters : || APCI16XX_TTL_WRITECHANNEL_ON | APCI16XX_TTL_WRITECHANNEL_OFF || b_SelectedPort = CR_RANGE(insn->chanspec); || b_OutputChannel= CR_CHAN(insn->chanspec); || b_Command = (BYTE) data[0]; || || APCI16XX_TTL_WRITEPORT_ON | APCI16XX_TTL_WRITEPORT_OFF || b_SelectedPort = CR_RANGE(insn->chanspec); || b_Command = (BYTE) data[0]; |+----------------------------------------------------------------------------+| Output Parameters : data[0] : TTL output port 0 to 3 data || data[1] : TTL output port 4 to 7 data || .... |+----------------------------------------------------------------------------+| Return Value : >0 : No error || -100 : Command error || -101 : Data size error || -102 : The selected TTL output port is wrong || -103 : The selected TTL digital output is wrong || -104 : Output memory disabled |+----------------------------------------------------------------------------+*/int i_APCI16XX_InsnBitsWriteTTLIO (comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { INT i_ReturnValue = insn->n; BYTE b_Command = 0; BYTE b_NumberOfPort = (BYTE) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8); BYTE b_SelectedPort = CR_RANGE(insn->chanspec); BYTE b_OutputChannel = CR_CHAN(insn->chanspec); DWORD dw_Status = 0; /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 1) { /*******************/ /* Get the command */ /* *****************/ b_Command = (BYTE) data[0]; /********************/ /* Test the command */ /********************/ if ((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) || (b_Command == APCI16XX_TTL_WRITEPORT_ON) || (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) { /**************************/ /* Test the selected port */ /**************************/ if (b_SelectedPort < b_NumberOfPort) { /***********************/ /* Test if output port */ /***********************/ if (((devpriv->ul_TTLPortConfiguration[b_SelectedPort / 4] >> (8 * (b_SelectedPort % 4))) & 0xFF) == 0xFF) { /***************************/ /* Test the channel number */ /***************************/ if (((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) || (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF)) && (b_OutputChannel > 7)) { /********************************************/ /* The selected TTL digital output is wrong */ /********************************************/ printk("\nChannel selection error"); i_ReturnValue = -103; } if (((b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE)) { /********************************************/ /* The selected TTL digital output is wrong */ /********************************************/ printk("\nOutput memory disabled"); i_ReturnValue = -104; } /************************/ /* Test the buffer size */ /************************/ if (((b_Command == APCI16XX_TTL_WRITEPORT_ON) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (insn->n < 2)) { /*******************/ /* Data size error */ /*******************/ printk("\nBuffer size error"); i_ReturnValue = -101; } } else { /*****************************************/ /* The selected TTL output port is wrong */ /*****************************************/ printk("\nPort selection error %lX", devpriv->ul_TTLPortConfiguration[0]); i_ReturnValue = -102; } } else { /****************************************/ /* The selected TTL output port is wrong */ /****************************************/ printk("\nPort selection error %d %d",b_SelectedPort , b_NumberOfPort); i_ReturnValue = -102; } } else { /************************/ /* Config command error */ /************************/ printk("\nCommand selection error"); i_ReturnValue = -100; } } else { /*******************/ /* Data size error */ /*******************/ printk("\nBuffer size error"); i_ReturnValue = -101; } /**************************/ /* Test if no error occur */ /**************************/ if (i_ReturnValue >= 0) { /********************************/ /* Get the digital output state */ /********************************/ dw_Status = inl(devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4)); /**********************************/ /* Test if output memory not used */ /**********************************/ if (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE) { /*********************************/ /* Clear the selected port value */ /*********************************/ dw_Status = dw_Status & (0xFFFFFFFFUL - (0xFFUL << (8 * (b_SelectedPort % 4)))); } /******************************/ /* Test if setting channel ON */ /******************************/ if (b_Command == APCI16XX_TTL_WRITECHANNEL_ON) { dw_Status = dw_Status | (1UL << ((8 * (b_SelectedPort % 4)) + b_OutputChannel)); } /***************************/ /* Test if setting port ON */ /***************************/ if (b_Command == APCI16XX_TTL_WRITEPORT_ON) { dw_Status = dw_Status | ((data[1] & 0xFF) << (8 * (b_SelectedPort % 4))); } /*******************************/ /* Test if setting channel OFF */ /*******************************/ if (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) { dw_Status = dw_Status & (0xFFFFFFFFUL - (1UL << ((8 * (b_SelectedPort % 4)) + b_OutputChannel))); } /****************************/ /* Test if setting port OFF */ /****************************/ if (b_Command == APCI16XX_TTL_WRITEPORT_OFF) { dw_Status = dw_Status & (0xFFFFFFFFUL - ((data[1] & 0xFF) << (8 * (b_SelectedPort % 4)))); } outl(dw_Status, devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4)); } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function Name : int i_APCI2200_Reset(comedi_device *dev) | +----------------------------------------------------------------------------+| Task :resets all the registers |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : - |+----------------------------------------------------------------------------+*/ int i_APCI16XX_Reset(comedi_device *dev) { return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -