📄 hwdrv_apci1500.c
字号:
if (i_PatternTransitionCount > 1) { /****************************************/ /* Transition error on an AND logic */ /****************************************/ printk("\n Transition error on an AND logic\n"); return -EINVAL; }// if (i_PatternTransitionCount > 1) }// if (data[1]== APCI1500_AND) /*****************************************************************/ /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */ /*****************************************************************/ outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /******************/ /* Disable Port A */ /******************/ outb(0xF0,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /**********************************************/ /* Selects the polarity register of port 1 */ /**********************************************/ outb(APCI1500_RW_PORT_A_PATTERN_POLARITY,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); outb(i_PatternPolarity,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /*********************************************/ /* Selects the pattern mask register of */ /* port 1 */ /*********************************************/ outb(APCI1500_RW_PORT_A_PATTERN_MASK,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); outb(i_PatternMask,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /********************************************/ /* Selects the pattern transition register */ /* of port 1 */ /********************************************/ outb(APCI1500_RW_PORT_A_PATTERN_TRANSITION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); outb(i_PatternTransition,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /******************************************/ /* Selects the mode specification mask */ /* register of port 1 */ /******************************************/ outb(APCI1500_RW_PORT_A_SPECIFICATION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); i_RegValue=inb(devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /******************************************/ /* Selects the mode specification mask */ /* register of port 1 */ /******************************************/ outb(APCI1500_RW_PORT_A_SPECIFICATION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /**********************/ /* Port A new mode */ /**********************/ i_RegValue=(i_RegValue & 0xF9) | data[1]|0x9; outb(i_RegValue,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); i_Event1Status=1; /*****************************************************************/ /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */ /*****************************************************************/ outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /*****************/ /* Enable Port A */ /*****************/ outb(0xF4,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); }// if(data[1]==APCI1500_AND||data[1]==APCI1500_OR||data[1]==APCI1500_OR_PRIORITY) else { printk("\nThe choice for interrupt logic does not exist\n"); return -EINVAL; }// else }// if(data[1]==APCI1500_AND||data[1]==APCI1500_OR||data[1]==APCI1500_OR_PRIORITY) }// if (data[0]== 1) /************************************/ /* Test if event setting for port 2 */ /************************************/ if (data[0] == 2) { /************************/ /* Test the event logic */ /************************/ if (data[1] == APCI1500_OR) { /*****************************************************************/ /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */ /*****************************************************************/ outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /******************/ /* Disable Port B */ /******************/ outb(0x74,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /****************************************/ /* Selects the mode specification mask */ /* register of port B */ /****************************************/ outb( APCI1500_RW_PORT_B_SPECIFICATION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); i_RegValue=inb(devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /******************************************/ /* Selects the mode specification mask */ /* register of port B */ /******************************************/ outb(APCI1500_RW_PORT_B_SPECIFICATION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); i_RegValue=i_RegValue & 0xF9; outb(i_RegValue,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /**********************************/ /* Selects error channels 1 and 2 */ /**********************************/ i_PatternMask = (i_PatternMask | 0xC0); i_PatternPolarity = (i_PatternPolarity | 0xC0); i_PatternTransition = (i_PatternTransition | 0xC0); /**********************************************/ /* Selects the polarity register of port 2 */ /**********************************************/ outb(APCI1500_RW_PORT_B_PATTERN_POLARITY,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); outb( i_PatternPolarity,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /**********************************************/ /* Selects the pattern transition register */ /* of port 2 */ /**********************************************/ outb(APCI1500_RW_PORT_B_PATTERN_TRANSITION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); outb(i_PatternTransition,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /**********************************************/ /* Selects the pattern Mask register */ /* of port 2 */ /**********************************************/ outb(APCI1500_RW_PORT_B_PATTERN_MASK,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); outb(i_PatternMask,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /******************************************/ /* Selects the mode specification mask */ /* register of port 2 */ /******************************************/ outb(APCI1500_RW_PORT_B_SPECIFICATION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); i_RegValue=inb(devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /******************************************/ /* Selects the mode specification mask */ /* register of port 2 */ /******************************************/ outb( APCI1500_RW_PORT_B_SPECIFICATION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); i_RegValue=(i_RegValue & 0xF9) | 4; outb(i_RegValue,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); i_Event2Status=1; /*****************************************************************/ /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */ /*****************************************************************/ outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /*****************/ /* Enable Port B */ /*****************/ outb(0xF4,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); }// if (data[1] == APCI1500_OR) else { printk("\nThe choice for interrupt logic does not exist\n"); return -EINVAL; }//elseif (data[1] == APCI1500_OR) }//if(data[0]==2) return insn->n;} /*+----------------------------------------------------------------------------+| Function Name : int i_APCI1500_StartStopInputEvent || (comedi_device *dev,comedi_subdevice *s, || comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Allows or disallows a port event |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev : Driver handle || UINT ui_Channel : Channel number to read || lsampl_t *data : Data Pointer to read status | data[0] :0 Start input event 1 Stop input event data[1] :No of port (1 or 2) +----------------------------------------------------------------------------+| Output Parameters : -- |+----------------------------------------------------------------------------+| Return Value : TRUE : No error occur || : FALSE : Error occur. Return the error || |+----------------------------------------------------------------------------+*/int i_APCI1500_StartStopInputEvent(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data){int i_Event1InterruptStatus=0,i_Event2InterruptStatus=0,i_RegValue;switch(data[0]) { case START : /*************************/ /* Tests the port number */ /*************************/ if (data[1] == 1 || data[1] == 2) { /***************************/ /* Test if port 1 selected */ /***************************/ if ( data[1] == 1) { /*****************************/ /* Test if event initialised */ /*****************************/ if(i_Event1Status==1) { /*****************************************************************/ /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */ /*****************************************************************/ outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /******************/ /* Disable Port A */ /******************/ outb(0xF0,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /***************************************************/ /* Selects the command and status register of */ /* port 1 */ /***************************************************/ outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /*************************************/ /* Allows the pattern interrupt */ /*************************************/ outb(0xC0,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /*****************************************************************/ /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */ /*****************************************************************/ outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); /*****************/ /* Enable Port A */ /*****************/ outb(0xF4,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER); i_Event1InterruptStatus=1; outb(APCI1500_RW_PORT_A_SPECIFICATION,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -