⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 profim.c

📁 profibus-dp主站源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
              }
              if ( DeviceExtension->RTL==0 )
              {
                DeviceExtension->ContinueFrame = FALSE;
                DeviceExtension->RTL = 3;
              }
            }
            
            u950pci_RxTreshold( DeviceExtension , DeviceExtension->RTL );
          
          #else // USE_RX_FIFO **************************************
          
            //
            // Read the UART receive register
            //
            ch = u950pci_inb( DeviceExtension->port, UART_RX );

            if ( DeviceExtension->Sending == FALSE ||
                 ( DeviceExtension->Sending == TRUE &&
                   DeviceExtension->ActualType != DATA_CHAR ) )  // prijaty znak je z vnejsku
            {
              PB_RxByte( &( DeviceExtension->PB ), ch );            
            }
            else
            {
              // prijaty znak je z HW loopbacku prevodniku
              // melo by se jednat pouze o znovu prijate DATA_CHAR
              // zahazujeme...            
              DeviceExtension->RXCountDown--;
            }
            
          #endif // USE_RX_FIFO *************************************
        
          break;

          
        //*********************************************************************                                      
        // Transmitter holding register empty
        //*********************************************************************                                              
        case UART_IIR_THRI:        
        
          switch ( DeviceExtension->ActualType )
          {
            case DATA_CHAR:
              DeviceExtension->FlushTCH = FALSE;
              //RS_DbgPrint ("ISR TX DATA_CHAR \n"); 
              if ( ( DeviceExtension->XmitTypeBuffer[DeviceExtension->XmitFirst] ==
                     DATA_CHAR ) &&
                   !AllSent( DeviceExtension ) )
              {
                // next byte out                                     
                //DbgPrint( "Vysilany znak = %x\n", DeviceExtension->XmitBuffer[DeviceExtension->XmitFirst] );                                   
                FillTxBuffer( DeviceExtension );                
              }             
              else
              {
                // drive v DPC
                
                //
                // Switch to receive
                //
                #ifdef AUTOMATIC_RX
                  // Disable automatic DTR control
                  u950pci_acr_write( DeviceExtension, U950PCI_RX_ACR( DeviceExtension) );
                #else
                  u950pci_outb( DeviceExtension->port, UART_MCR, U950PCI_RX_MCR( DeviceExtension ) );
                #endif
                

                if ( AllSent( DeviceExtension ) )
                {
                  // Stahnout priznak vysilani
                  DeviceExtension->Sending = FALSE;

                  // Oznamime Profibusu kompletni zpracovani vysilaciho bufferu
                  PB_FrameOut( &( DeviceExtension->PB ) );
                }
                else
                {
                  Jam_First_Out( DeviceExtension );
                }               
              }
              break;


            case TIMING_CHAR:
              //RS_DbgPrint ("ISR TX TIMING_CHAR \n");          
              if ( DeviceExtension->FlushTCH == TRUE )
              {
                while ( DeviceExtension->XmitTypeBuffer[DeviceExtension->XmitFirst] ==
                        TIMING_CHAR &&
                        DeviceExtension->XmitFirst !=
                        DeviceExtension->XmitLast )
                {
                  DeviceExtension->XmitFirst++;
                  if ( DeviceExtension->XmitFirst >= DeviceExtension->BufferSize )
                    DeviceExtension->XmitFirst = 0;
                }                            
                DeviceExtension->FlushTCH = FALSE;                   
                //break;
              }

              if ( ( DeviceExtension->XmitTypeBuffer[DeviceExtension->XmitFirst] ==
                     TIMING_CHAR ) &&
                   !AllSent( DeviceExtension ) )
              {
                // next byte out                                                        
                //DbgPrint( "Vysilany znak = %x\n", DeviceExtension->XmitBuffer[DeviceExtension->XmitFirst] );
                FillTxBuffer( DeviceExtension );              
              }
              else
              {                
                // drive v DPC
                
                PB_TimeTick( &( DeviceExtension->PB ) );                                
                
                if ( AllSent( DeviceExtension ) )
                {
                  DeviceExtension->Sending = FALSE;
                }
                else
                {
                  Jam_First_Out( DeviceExtension );
                }   
                DeviceExtension->FlushTCH = FALSE;                

              }       
              break;


            case SYN_CHAR:
              DeviceExtension->FlushTCH = FALSE;
              //RS_DbgPrint ("ISR TX SYN_CHAR \n");                         
              if ( ( DeviceExtension->XmitTypeBuffer[DeviceExtension->XmitFirst] ==
                     SYN_CHAR ) &&
                   !AllSent( DeviceExtension ) )
              {
                // next byte out                     
                //DbgPrint( "Vysilany znak = %x\n", DeviceExtension->XmitBuffer[DeviceExtension->XmitFirst] );                                   
                FillTxBuffer( DeviceExtension );
              }
              else
              {
                
                // drive v DPC
                
                if ( AllSent( DeviceExtension ) )
                {
                  DeviceExtension->Sending = FALSE;
                }
                else
                {
                  Jam_First_Out( DeviceExtension );
                }   
                DeviceExtension->FlushTCH = FALSE;

              }               
              break;
          }
          break;
          
      }
      
      ch = u950pci_inb( DeviceExtension->port, UART_IIR );    // Read the IIR again for the next loop      
    }
    
  DeviceExtension->InterruptRunning = FALSE;      /*DEBUG*/
  if (DeviceExtension->SecondInterrupt) {
    DeviceExtension->SecondInterrupt = FALSE;
    //DbgPrint("ProfiM - ukonceni prerusene obsluhy preruseni...");
  }
  
  
  /*DEBUG*/  
  //u950pci_outb( DeviceExtension->port, UART_IER, 
  //              UART_IER_RDI | UART_IER_THRI | UART_IER_RLSI );   // Enable Interrupts

            
  }
  //*******************************************************  
  //  ISR for standard COM
  //*******************************************************    
  else
  {    
    
    //
    // For the 8250 series UART, we must spin and handle ALL interrupts
    // before returning
    //

    ch = READ_PORT_UCHAR( DeviceExtension->ComPort.IIR );
    
    //
    // Je preruseni pro nas?
    //
    if ( ch & IIR_NO_INTERRUPT_PENDING )
      return FALSE;
      
    if ( !DeviceExtension->PB.AllInitialized )
      return TRUE;   
    

    while ( ( ch & IIR_INTERRUPT_MASK ) != IIR_NO_INTERRUPT_PENDING )
    {
      switch ( ch & IIR_INTERRUPT_MASK )
      {
        //*********************************************************************
        //  8250 Error 
        //*********************************************************************
        case IIR_RX_ERROR_IRQ_PENDING:
          // 1st priority interrupt
          ch = READ_PORT_UCHAR( DeviceExtension->ComPort.LSR );
          DbgPrint( "ProfiM: ISR RX Error!  LSR=%x\n", ch );                
          DeviceExtension->RcvError++;

          if ( DeviceExtension->Sending )
          {
            // Switch to receive
            ch = READ_PORT_UCHAR( DeviceExtension->ComPort.MCR ) & MCR_DEACTIVATE_RTS;
            WRITE_PORT_UCHAR( DeviceExtension->ComPort.MCR, ch );               

            DeviceExtension->Sending = FALSE;
            DeviceExtension->XmitFirst = DeviceExtension->XmitLast;   // vymazani celeho bufferu
            PB_FrameOut( &( DeviceExtension->PB ) );
          }

          break;



        //*********************************************************************
        //  Data received
        //*********************************************************************
        case IIR_RX_DATA_READY_IRQ_PENDING:
          // 2nd priority int

          //
          // Read the UART receive register
          //

          ch = READ_PORT_UCHAR( DeviceExtension->ComPort.RBR );

          if ( DeviceExtension->Sending == FALSE ||
               ( DeviceExtension->Sending == TRUE &&
                 DeviceExtension->ActualType != DATA_CHAR ) )  // prijaty znak je z vnejsku
          {
            PB_RxByte( &( DeviceExtension->PB ), ch );
          }
          else
          {
            // prijaty znak je z HW loopbacku prevodniku - melo by se jednat pouze o znovu prijate DATA_CHAR

            //RS_DbgPrint ("ProfiM: ISR RX data loopback\n");

            DeviceExtension->RXCountDown--;

            if ( DeviceExtension->RXCountDown <= 0 ) // vsechny znaky byly vyslany - konec vysilani - stahnout RTS
            {
              //
              // Switch to receive
              //

              ch = READ_PORT_UCHAR( DeviceExtension->ComPort.MCR ) & MCR_DEACTIVATE_RTS;
              WRITE_PORT_UCHAR( DeviceExtension->ComPort.MCR, ch );               

              //RS_DbgPrint ("ProfiM: RTS lowered\n");

              if ( AllSent( DeviceExtension ) )
              {
                // Stahnout priznak vysilani
                DeviceExtension->Sending = FALSE;

                // Oznamime Profibusu kompletni zpracovani vysilaciho bufferu
                PB_FrameOut( &( DeviceExtension->PB ) );
              }
              else
              {
                Jam_First_Out( DeviceExtension );
              }
            }                
            // else  zahodime prijaty znak
          }

          //
          // Get the current system time
          //

          //KeQuerySystemTime (&DeviceExtension->LastQuerySystemTime);

          break;



        //*********************************************************************   
        // Tx Register Empty    
        //*********************************************************************
        case IIR_TX_HBE_IRQ_PENDING:
          // 3rd priority interrupt

          //RS_DbgPrint ("ProfiM: ISR TX Data!\n");


          switch ( DeviceExtension->ActualType )
          {
            case DATA_CHAR:
              DeviceExtension->FlushTCH = FALSE;
              //RS_DbgPrint ("ISR TX DATA_CHAR \n"); 
              if ( ( DeviceExtension->XmitTypeBuffer[DeviceExtension->XmitFirst] ==
                     DATA_CHAR ) &&
                   !AllSent( DeviceExtension ) )
              {
                //              DbgPrint ("Dalsi datovy byte ven : %d\n",DeviceExtension->XmitBuffer[DeviceExtension->XmitFirst] ); 
                // next byte out                                                        
                WRITE_PORT_UCHAR( DeviceExtension->ComPort.TBR,
                                  DeviceExtension->XmitBuffer[DeviceExtension->XmitFirst] );

                DeviceExtension->XmitFirst++;
                if ( DeviceExtension->XmitFirst >= DeviceExtension->BufferSize )
                  DeviceExtension->XmitFirst = 0;
              }             
              break;


            case TIMING_CHAR:
              //RS_DbgPrint ("ISR TX TIMING_CHAR \n");          
              if ( DeviceExtension->FlushTCH == TRUE )
              {
                while ( DeviceExtension->XmitTypeBuffer[DeviceExtension->XmitFirst] ==
                        TIMING_CHAR &&
                        DeviceExtension->XmitFirst !=
                        DeviceExtension->XmitLast )
                {
                  DeviceExtension->XmitFirst++;
                  if ( DeviceExtension->XmitFirst >= DeviceExtension->BufferSize )
                    DeviceExtension->XmitFirst = 0;
                }            
                DeviceExtension->FlushTCH = FALSE;   
                //break;  // nemuze tady byt musi se pockat na konec znaku
              }

              if ( ( DeviceExtension->XmitTypeBuffer[DeviceExtension->XmitFirst] ==
                     TIMING_CHAR ) &&
                   !AllSent( DeviceExtension ) )
              {
                // next byte out                                                        
                WRITE_PORT_UCHAR( DeviceExtension->ComPort.TBR,
                                  DeviceExtension->XmitBuffer[DeviceExtension->XmitFirst] );

                DeviceExtension->XmitFirst++;
                if ( DeviceExtension->XmitFirst >= DeviceExtension->BufferSize )
                  DeviceExtension->XmitFirst = 0;
              }
              else
              {
                #ifndef PISA_IO
                //
                // Schedule the DPC
                //
                //DbgPrint ("ISR TX TIMING_CHAR DPC Scheduled\n");                                                          
                IoRequestDpc( DeviceObject, DeviceObject->CurrentIrp, NULL );             
                #endif

                #ifdef PISA_IO
                //
                // povoleni preruseni od signalu modemu v DPC
                //
                if ( DeviceExtension->ModemInterruptState == MI_Disabled )
                {
                  DeviceExtension->MIEnabledTime = GetCurrentTicks();
                  IoRequestDpc( DeviceObject, DeviceObject->CurrentIrp, NULL );
                }                           
                #endif                        
              }       
              break;


            case SYN_CHAR:
              DeviceExtension->FlushTCH = FALSE;
              //RS_DbgPrint ("ISR TX SYN_CHAR \n");                         
              if ( ( DeviceExtension->XmitTypeBuffer[DeviceExtension->XmitFirst] ==
                     SYN_CHAR ) &&
                   !AllSent( DeviceExtension ) )
              {
                // next byte out                                                        
                WRITE_PORT_UCHAR( DeviceExtension->ComPort.TBR,
                                  DeviceExtension->XmitBuffer[DeviceExtension->XmitFirst] );

                DeviceExtension->XmitFirst++;
                if ( DeviceExtension->XmitFirst >= DeviceExtension->BufferSize )
                  DeviceExtension->XmitFirst = 0;
              }
              else
              {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -