📄 hwdrv_apci16xx.c
字号:
+----------------------------------------------------------------------------+| Task : Read the status from selected TTL digital input || (b_InputChannel) |+----------------------------------------------------------------------------+| Task : Read the status from digital input port || (b_SelectedPort) |+----------------------------------------------------------------------------+| Input Parameters : || APCI16XX_TTL_READCHANNEL || b_SelectedPort= CR_RANGE(insn->chanspec); || b_InputChannel= CR_CHAN(insn->chanspec); || b_ReadType = (BYTE) data[0]; || || APCI16XX_TTL_READPORT || b_SelectedPort= CR_RANGE(insn->chanspec); || b_ReadType = (BYTE) data[0]; |+----------------------------------------------------------------------------+| Output Parameters : data[0] 0 : Channle is not active | | 1 : Channle is active |+----------------------------------------------------------------------------+| Return Value : >0 : No error || -100 : Config command error || -101 : Data size error || -102 : The selected TTL input port is wrong || -103 : The selected TTL digital input is wrong |+----------------------------------------------------------------------------+*/int i_APCI16XX_InsnBitsReadTTLIO (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_InputChannel = CR_CHAN(insn->chanspec); BYTE * pb_Status; DWORD dw_Status; /************************/ /* Test the buffer size */ /************************/ if (insn->n >= 1) { /*******************/ /* Get the command */ /* *****************/ b_Command = (BYTE) data[0]; /********************/ /* Test the command */ /********************/ if ((b_Command == APCI16XX_TTL_READCHANNEL) || (b_Command == APCI16XX_TTL_READPORT)) { /**************************/ /* Test the selected port */ /**************************/ if (b_SelectedPort < b_NumberOfPort) { /**********************/ /* Test if input port */ /**********************/ if (((devpriv->ul_TTLPortConfiguration[b_SelectedPort / 4] >> (8 * (b_SelectedPort % 4))) & 0xFF) == 0) { /***************************/ /* Test the channel number */ /***************************/ if ((b_Command == APCI16XX_TTL_READCHANNEL) && (b_InputChannel > 7)) { /*******************************************/ /* The selected TTL digital input is wrong */ /*******************************************/ printk("\nChannel selection error"); i_ReturnValue = -103; } } else { /****************************************/ /* The selected TTL input port is wrong */ /****************************************/ printk("\nPort selection error"); i_ReturnValue = -102; } } else { /****************************************/ /* The selected TTL input port is wrong */ /****************************************/ printk("\nPort selection error"); 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) { pb_Status = (PBYTE) &data[0]; /*******************************/ /* Get the digital inpu status */ /*******************************/ dw_Status = inl(devpriv->iobase + 8 + ((b_SelectedPort / 4) * 4)); dw_Status = (dw_Status >> (8 * (b_SelectedPort % 4))) & 0xFF; /***********************/ /* Save the port value */ /***********************/ *pb_Status = (BYTE) dw_Status; /***************************************/ /* Test if read channel status command */ /***************************************/ if (b_Command == APCI16XX_TTL_READCHANNEL) { *pb_Status = (*pb_Status >> b_InputChannel) & 1; } } return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function Name : INT i_APCI16XX_InsnReadTTLIOAllPortValue || (comedi_device *dev, || comedi_subdevice *s, || comedi_insn *insn, || lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Read the status from all digital input ports |+----------------------------------------------------------------------------+| Input Parameters : - |+----------------------------------------------------------------------------+| Output Parameters : data[0] : Port 0 to 3 data || data[1] : Port 4 to 7 data || .... |+----------------------------------------------------------------------------+| Return Value : 0: No error || -100 : Read command error || -101 : Data size error |+----------------------------------------------------------------------------+*/int i_APCI16XX_InsnReadTTLIOAllPortValue (comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data) { BYTE b_Command = (BYTE) CR_AREF(insn->chanspec); INT i_ReturnValue = insn->n; BYTE b_Cpt = 0; BYTE b_NumberOfPort = 0; lsampl_t * pls_ReadData = data; /********************/ /* Test the command */ /********************/ if ((b_Command == APCI16XX_TTL_READ_ALL_INPUTS) || (b_Command == APCI16XX_TTL_READ_ALL_OUTPUTS)) { /**********************************/ /* Get the number of 32-Bit ports */ /**********************************/ b_NumberOfPort = (BYTE) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 32); if ((b_NumberOfPort * 32) < devpriv->ps_BoardInfo->i_NbrTTLChannel) { b_NumberOfPort = b_NumberOfPort + 1; } /************************/ /* Test the buffer size */ /************************/ if (insn->n >= b_NumberOfPort) { if (b_Command == APCI16XX_TTL_READ_ALL_INPUTS) { /**************************/ /* Read all digital input */ /**************************/ for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt ++) { /************************/ /* Read the 32-Bit port */ /************************/ pls_ReadData [b_Cpt] = inl(devpriv->iobase + 8 + (b_Cpt * 4)); /**************************************/ /* Mask all channels used als outputs */ /**************************************/ pls_ReadData [b_Cpt] = pls_ReadData [b_Cpt] & (~devpriv->ul_TTLPortConfiguration[b_Cpt]); } } else { /****************************/ /* Read all digital outputs */ /****************************/ for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt ++) { /************************/ /* Read the 32-Bit port */ /************************/ pls_ReadData [b_Cpt] = inl(devpriv->iobase + 20 + (b_Cpt * 4)); /**************************************/ /* Mask all channels used als outputs */ /**************************************/ pls_ReadData [b_Cpt] = pls_ReadData [b_Cpt] & devpriv->ul_TTLPortConfiguration[b_Cpt]; } } } else { /*******************/ /* Data size error */ /*******************/ printk("\nBuffer size error"); i_ReturnValue = -101; } } else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -