void LPC22XX_USART_Driver::TxBufferEmptyInterruptEnable( int ComPortNum, BOOL Enable  )
{
    GLOBAL_LOCK(irq);

    LPC22XX_USART& USARTC = LPC22XX::UART(ComPortNum);
    
    ASSERT(LPC22XX_USART_Driver::IsValidPortNum(ComPortNum));    

    if (Enable)
    {
       USARTC.SEL2.IER.UART_IER |=  (LPC22XX_USART::UART_IER_THREIE);      

        char c;
        for (int i=0; i<2; i++)
        {
            if (USART_RemoveCharFromTxBuffer( ComPortNum, c ))
            {
                WriteCharToTxBuffer( ComPortNum, c );
                Events_Set( SYSTEM_EVENT_FLAG_COM_OUT );
            }
            else
                break;
        }

       
    }
    else
    {
       USARTC.SEL2.IER.UART_IER &= ~(LPC22XX_USART::UART_IER_THREIE);              
    }

}
void LPC22XX_USART_Driver::UART_IntHandler (void *param)
{
   GLOBAL_LOCK(irq);

   ASSERT(LPC22XX_USART_Driver::IsValidPortNum((UINT32)param));    

   char c; 
   UINT32 ComNum = (UINT32)param;
   UINT32 i,rxcnt;  
   LPC22XX_USART& USARTC = LPC22XX::UART(ComNum);
   volatile UINT32 IIR_Value;
   volatile UINT32 LSR_Value;

    // Read data from Rx FIFO

    LSR_Value = USARTC.UART_LSR;

    while (LSR_Value & LPC22XX_USART::UART_LSR_RFDR)
    {
      UINT8 rxdata = (UINT8 )USARTC.SEL1.RBR.UART_RBR;
      rxcnt++;
      if ( 0 == (LSR_Value &
                   (
                       LPC22XX_USART::UART_LSR_PEI | 
                       LPC22XX_USART::UART_LSR_OEI |
                       LPC22XX_USART::UART_LSR_FEI                    
                   )    
                )
         )                                                         
      {
          // No errors in Rx data       
          USART_AddCharToRxBuffer(ComNum, rxdata);
          Events_Set( SYSTEM_EVENT_FLAG_COM_IN );
      }
      LSR_Value = USARTC.UART_LSR;               
  }
   // Send up to 2 bytes of Tx data

   for (i = 0; i <2; i++)
   {

       if (USART_RemoveCharFromTxBuffer( ComNum, c ))
       {
           WriteCharToTxBuffer( ComNum, c );
           Events_Set( SYSTEM_EVENT_FLAG_COM_OUT );
       }
       else
       {
           // Disable further TxBufferEmptyInterrupt. It will be
		       // enabled by the PAL uart driver when a character to the
		       // TxBuffer is added
           TxBufferEmptyInterruptEnable( ComNum, FALSE );
           break;
       }
   }

   // Check if IIR read is required to clear the uart Rx interrupt
   IIR_Value = USARTC.SEL3.IIR.UART_IIR; 

}
Exemplo n.º 3
0
// ---------------------------------------------------------------------------
void USART_IRQHandler(int ComPortNum, int Direction)
{
    LPC_USART_T *usart = USART_REG(ComPortNum);
    char c;

    switch (Direction)
    {
        case 1: // Transmit
            if (USART_RemoveCharFromTxBuffer(ComPortNum, c))
            {
                usart->THR = c;  // Write data
            } else {
                CPU_USART_TxBufferEmptyInterruptEnable(ComPortNum, FALSE); // Disable interrupt
            }
            Events_Set(SYSTEM_EVENT_FLAG_COM_OUT);
            break;

        case 2: // Receive
            c = (char)(usart->RBR); // Read data
            USART_AddCharToRxBuffer(ComPortNum, c);
            Events_Set(SYSTEM_EVENT_FLAG_COM_IN);
            break;

        default:
            break;
    }
}
void PXA271_USART_Driver::USART_ISR( void* param )
{
    // we lock since we are low priority and anyone might try to add a char in another ISR
    GLOBAL_LOCK(irq);
    UINT32       comPort = (UINT32)param;

    PXA271_USART& USART = PXA271::USART( comPort );

    switch( USART.IIR & PXA271_USART::IIR__IID_MASK )
    {

    case PXA271_USART::IIR__IID_RECEIVE_DATA:       // If data in input FIFO
        // if the charger came in and turned off the serial port, bail now, as the source
        // will be going away
        if(c_RefFlagRx & g_PXA271_USART_Driver.m_RefFlags[comPort])
        {
            if(USART.LSR & PXA271_USART::LSR__DR)
            {
                USART_AddCharToRxBuffer( comPort, (char)(USART.RBR & PXA271_USART::RBR__DATA_MASK8) );

                Events_Set( SYSTEM_EVENT_FLAG_COM_IN );
            }
        }
        break;

    case PXA271_USART::IIR__IID_TRANSMIT_FIFO:      // If transmit FIFO can accept more characters
        // if the charger came in and turned off the serial port, bail now, as the source
        // will be going away
        if(c_RefFlagTx & g_PXA271_USART_Driver.m_RefFlags[comPort])
        {
            char c;

            if(USART_RemoveCharFromTxBuffer( comPort, c ))
            {
                WriteCharToTxBuffer( comPort, c );
            }
            else
            {
                // disable further Tx interrupts since we are level triggered
                TxBufferEmptyInterruptEnable( comPort, FALSE );
            }

            Events_Set( SYSTEM_EVENT_FLAG_COM_OUT );
        }
        break;

#if defined(_DEBUG)
    case PXA271_USART::IIR__IID_RECEIVE_ERROR:      // If there was an error receiving a character
        if(0 != (c_RefFlagRx & g_PXA271_USART_Driver.m_RefFlags[comPort]))
        {
            lcd_printf("\fLSR=%02x\r\n", USART.LSR & PXA271_USART::LSR__ERRORS);
        }
        break;
#endif

    }

}
void STM32F4_USART_Handle_TX_IRQ (int ComPortNum, USART_TypeDef* uart)
{
    INTERRUPT_START;

    char c;
    if (USART_RemoveCharFromTxBuffer(ComPortNum, c)) {
        uart->DR = c;  // write TX data
    } else {
        uart->CR1 &= ~USART_CR1_TXEIE; // TX int disable
    }
    Events_Set(SYSTEM_EVENT_FLAG_COM_OUT);

    INTERRUPT_END;
}
void USART_TxISR( UINT32 port )
{
    char c;
    GLOBAL_LOCK(irq);

    if(USART_RemoveCharFromTxBuffer( port, c ))
    {
        CPU_USART_WriteCharToTxBuffer( port, c );
        Events_Set( SYSTEM_EVENT_FLAG_COM_OUT );
        
    }
    else
    {
        CPU_USART_TxBufferEmptyInterruptEnable( port, FALSE );
    }

}
void LPC24XX_USART_Driver::UART_IntHandler (void *param)
{

   GLOBAL_LOCK(irq);

   ASSERT(LPC24XX_USART_Driver::IsValidPortNum((UINT32)param));    
   char c; 
   UINT32 ComNum = (UINT32)param;
   UINT32 i;
   UINT32 rxcnt=0;  
   LPC24XX_USART& USARTC = LPC24XX::UART(ComNum);
   volatile UINT32 IIR_Value;
   volatile UINT32 LSR_Value;

   volatile register UINT32 * regRBR = &(USARTC.SEL1.RBR.UART_RBR);
   volatile register UINT32 * regLSR = &(USARTC.UART_LSR);

   IIR_Value = USARTC.SEL3.IIR.UART_IIR & LPC24XX_USART::UART_IIR_IID_mask; 

   if (IIR_Value & LPC24XX_USART::UART_IIR_NIP)
         ASSERT(0);

    // Read data from Rx FIFO

   while (true) 
   {
     LSR_Value = *regLSR ;

     if (LSR_Value & LPC24XX_USART::UART_LSR_RFDR)
     {
       volatile UINT8 rxdata = (UINT8 ) *regRBR;
        // No errors in Rx data       
       USART_AddCharToRxBuffer(ComNum, rxdata);

     }
     else
       break;
   }
   // Send up to 2 bytes of Tx data


   for (i = 0; i <2; i++)
   {

     if (USART_RemoveCharFromTxBuffer( ComNum, c ))
	 {
	     WriteCharToTxBuffer( ComNum, c );
	     Events_Set( SYSTEM_EVENT_FLAG_COM_OUT );
	 }
	 else
     {
	     // Disable further TxBufferEmptyInterrupt. It will be
         // enabled by the PAL uart driver when a character to the
	     // TxBuffer is added
	     TxBufferEmptyInterruptEnable( ComNum, FALSE );
	     break;
	 }

   }


}