📄 apci1710_ssi.c
字号:
{ INT i_ReturnValue = 0; BYTE b_Cpt; BYTE b_Length; BYTE b_Schift; BYTE b_SSICpt; DWORD dw_And; DWORD dw_And1; DWORD dw_And2; DWORD dw_StatusReg; DWORD dw_CounterValue; BYTE b_ModulNbr; BYTE b_SelectedSSI; BYTE b_ReadType; PULONG pul_Position; PULONG pul_TurnCpt; PULONG pul_Position1; PULONG pul_TurnCpt1; i_ReturnValue = insn->n; pul_Position1 = (PULONG) &data[0];// For Read1 pul_TurnCpt1 = (PULONG) &data[1];// For Read all pul_Position = (PULONG) &data[0];//0-2 pul_TurnCpt = (PULONG) &data[3];//3-5 b_ModulNbr = (BYTE) CR_AREF(insn->chanspec); b_SelectedSSI = (BYTE) CR_CHAN(insn->chanspec); b_ReadType = (BYTE) CR_RANGE(insn->chanspec); /**************************/ /* Test the module number */ /**************************/ if (b_ModulNbr < 4) { /***********************/ /* Test if SSI counter */ /***********************/ if ((devpriv->s_BoardInfos. dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF0000UL) == APCI1710_SSI_COUNTER) { /***************************/ /* Test if SSI initialised */ /***************************/ if (devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_SSIInit == 1) { switch(b_ReadType) { case APCI1710_SSI_READ1VALUE : /****************************************/ /* Test the selected SSI counter number */ /****************************************/ if (b_SelectedSSI < 3) { /************************/ /* Start the conversion */ /************************/ outl(0,devpriv->s_BoardInfos.ui_Address + 8 + (64 * b_ModulNbr)); do { /*******************/ /* Read the status */ /*******************/ dw_StatusReg = inl(devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr)); } while ((dw_StatusReg & 0x1) != 0); /******************************/ /* Read the SSI counter value */ /******************************/ dw_CounterValue = inl(devpriv->s_BoardInfos.ui_Address + 4 + (b_SelectedSSI * 4) + (64 * b_ModulNbr)); b_Length = devpriv->s_ModuleInfo [b_ModulNbr].s_SSICounterInfo.b_SSIProfile / 2; if ((b_Length * 2) != devpriv->s_ModuleInfo [b_ModulNbr].s_SSICounterInfo.b_SSIProfile) { b_Length ++; } b_Schift = b_Length - devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_PositionTurnLength; *pul_Position1 = dw_CounterValue >> b_Schift; dw_And = 1; for (b_Cpt = 0; b_Cpt < devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_PositionTurnLength; b_Cpt ++) { dw_And = dw_And * 2; } *pul_Position1 = *pul_Position1 & ((dw_And) - 1); *pul_TurnCpt1 = dw_CounterValue >> b_Length; dw_And = 1; for (b_Cpt = 0; b_Cpt < devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_TurnCptLength; b_Cpt ++) { dw_And = dw_And * 2; } *pul_TurnCpt1 = *pul_TurnCpt1 & ((dw_And) - 1); } else { /*****************************/ /* The selected SSI is wrong */ /*****************************/ DPRINTK("The selected SSI is wrong\n"); i_ReturnValue = -5; } break; case APCI1710_SSI_READALLVALUE : dw_And1 = 1; for (b_Cpt = 0; b_Cpt < devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_PositionTurnLength; b_Cpt ++) { dw_And1 = dw_And1 * 2; } dw_And2 = 1; for (b_Cpt = 0; b_Cpt < devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_TurnCptLength; b_Cpt ++) { dw_And2 = dw_And2 * 2; } /************************/ /* Start the conversion */ /************************/ outl(0,devpriv->s_BoardInfos.ui_Address + 8 + (64 * b_ModulNbr)); do { /*******************/ /* Read the status */ /*******************/ dw_StatusReg = inl(devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr)); } while ((dw_StatusReg & 0x1) != 0); for (b_SSICpt = 0; b_SSICpt < 3; b_SSICpt ++) { /******************************/ /* Read the SSI counter value */ /******************************/ dw_CounterValue = inl(devpriv->s_BoardInfos.ui_Address + 4 + (b_SSICpt * 4) + (64 * b_ModulNbr)); b_Length = devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_SSIProfile / 2; if ((b_Length * 2) != devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_SSIProfile) { b_Length ++; } b_Schift = b_Length - devpriv->s_ModuleInfo [b_ModulNbr]. s_SSICounterInfo. b_PositionTurnLength; pul_Position [b_SSICpt] = dw_CounterValue >> b_Schift; pul_Position [b_SSICpt] = pul_Position [b_SSICpt] & ((dw_And1) - 1); pul_TurnCpt [b_SSICpt] = dw_CounterValue >> b_Length; pul_TurnCpt [b_SSICpt] = pul_TurnCpt [b_SSICpt] & ((dw_And2) - 1); } break; default : printk("Read Type Inputs Wrong\n"); } // switch ending } else { /***********************/ /* SSI not initialised */ /***********************/ DPRINTK("SSI not initialised\n"); i_ReturnValue = -4; } } else { /**********************************/ /* The module is not a SSI module */ /**********************************/ DPRINTK("The module is not a SSI module\n"); i_ReturnValue = -3; } } else { /***********************/ /* Module number error */ /***********************/ DPRINTK("Module number error\n"); i_ReturnValue = -2; } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function Name : _INT_ i_APCI1710_ReadSSI1DigitalInput || (BYTE_ b_BoardHandle, || BYTE_ b_ModulNbr, || BYTE_ b_InputChannel, || PBYTE_ pb_ChannelStatus) |+----------------------------------------------------------------------------+| Task : (0) Set the digital output from selected SSI moule || (b_ModuleNbr) ON (1) Set the digital output from selected SSI moule || (b_ModuleNbr) OFF (2)Read the status from selected SSI digital input || (b_InputChannel) (3)Read the status from all SSI digital inputs from || selected SSI module (b_ModulNbr) |+----------------------------------------------------------------------------+| Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710|| BYTE_ b_ModulNbr CR_AREF : Module number to || configure (0 to 3) || BYTE_ b_InputChannel CR_CHAN : Selection from digital || data[0] which IOTYPE input ( 0 to 2) |+----------------------------------------------------------------------------+| Output Parameters : PBYTE_ pb_ChannelStatus : Digital input channel || data[0] status || 0 : Channle is not active|| 1 : Channle is active |+----------------------------------------------------------------------------+| Return Value : 0: No error || -1: The handle parameter of the board is wrong || -2: The module parameter is wrong || -3: The module is not a SSI module || -4: The selected SSI digital input is wrong |+----------------------------------------------------------------------------+*/INT i_APCI1710_InsnBitsSSIDigitalIO(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) { INT i_ReturnValue = 0; DWORD dw_StatusReg; BYTE b_ModulNbr; BYTE b_InputChannel; PBYTE pb_ChannelStatus; PBYTE pb_InputStatus; BYTE b_IOType; i_ReturnValue = insn->n; b_ModulNbr = (BYTE) CR_AREF(insn->chanspec); b_IOType = (BYTE) data[0]; /**************************/ /* Test the module number */ /**************************/ if (b_ModulNbr < 4) { /***********************/ /* Test if SSI counter */ /***********************/ if ((devpriv->s_BoardInfos. dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF0000UL) == APCI1710_SSI_COUNTER) { switch(b_IOType) { case APCI1710_SSI_SET_CHANNELON : /*****************************/ /* Set the digital output ON */ /*****************************/ outl(1,devpriv->s_BoardInfos.ui_Address + 16 + (64 * b_ModulNbr)); break ; case APCI1710_SSI_SET_CHANNELOFF : /******************************/ /* Set the digital output OFF */ /******************************/ outl(0,devpriv->s_BoardInfos.ui_Address + 16 + (64 * b_ModulNbr)); break ; case APCI1710_SSI_READ_1CHANNEL: /******************************************/ /* Test the digital imnput channel number */ /******************************************/ b_InputChannel = (BYTE) CR_CHAN(insn->chanspec); pb_ChannelStatus = (PBYTE) &data[0]; if (b_InputChannel <= 2) { /**************************/ /* Read all digital input */ /**************************/ dw_StatusReg = inl(devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr)); *pb_ChannelStatus = (BYTE) (((~dw_StatusReg) >> (4 + b_InputChannel)) & 1); } else { /********************************/ /* Selected digital input error */ /********************************/ DPRINTK("Selected digital input error\n"); i_ReturnValue = -4; } break; case APCI1710_SSI_READ_ALLCHANNEL: /**************************/ /* Read all digital input */ /**************************/ pb_InputStatus = (PBYTE) &data[0]; dw_StatusReg = inl(devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr)); *pb_InputStatus = (BYTE) (((~dw_StatusReg) >> 4) & 7); break; default : printk("IO type wrong\n"); } //switch end } else { /**********************************/ /* The module is not a SSI module */ /**********************************/ DPRINTK("The module is not a SSI module\n"); i_ReturnValue = -3; } } else { /***********************/ /* Module number error */ /***********************/ DPRINTK("Module number error\n"); i_ReturnValue = -2; } return (i_ReturnValue); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -