Пример #1
0
// Send: version with and without mux
void platform_uart_send( unsigned id, u8 data ) 
{
#ifdef BUILD_USB_CDC
  if( id == CDC_UART_ID )
    platform_usb_cdc_send( data );
#endif
#ifdef BUILD_SERMUX
  if( id >= SERMUX_SERVICE_ID_FIRST && id < SERMUX_SERVICE_ID_FIRST + SERMUX_NUM_VUART )
  {
    if( id != uart_service_id_out )
      platform_s_uart_send( SERMUX_PHYS_ID, id );
    uart_last_sent = data;
    if( data == SERMUX_ESCAPE_CHAR || data == SERMUX_FORCE_SID_CHAR || ( data >= SERMUX_SERVICE_ID_FIRST && data <= SERMUX_SERVICE_ID_LAST ) )
    {
      platform_s_uart_send( SERMUX_PHYS_ID, SERMUX_ESCAPE_CHAR );
      platform_s_uart_send( SERMUX_PHYS_ID, data ^ SERMUX_ESCAPE_XOR_MASK );
      uart_last_sent = SERMUX_ESC_MASK | ( data ^ SERMUX_ESCAPE_XOR_MASK );
    }
    else
      platform_s_uart_send( SERMUX_PHYS_ID, data );
    uart_service_id_out = id;
  }
#endif // #ifdef BUILD_SERMUX
  if( id < NUM_UART )
    platform_s_uart_send( id, data );
}
Пример #2
0
static void all_usart_irqhandler( int resnum )
{
  int temp;

  temp = USART_GetFlagStatus( stm32_usart[ resnum ], USART_FLAG_ORE );
  cmn_int_handler( INT_UART_RX, resnum );
  if( temp == SET )
    for( temp = 0; temp < 10; temp ++ )
      platform_s_uart_send( resnum, '@' );
}
Пример #3
0
static void cmn_rx_handler( int usart_id, u8 data )
{
#ifdef BUILD_SERMUX
  if( usart_id == SERMUX_PHYS_ID )
  {
    if( data != SERMUX_ESCAPE_CHAR )
    {
      if( ( data >= SERMUX_SERVICE_ID_FIRST ) && data < ( SERMUX_SERVICE_ID_FIRST + SERMUX_NUM_VUART ) )
        uart_service_id_in = data;
      else if( ( data == SERMUX_FORCE_SID_CHAR ) && ( uart_last_sent != -1 ) )
      {
        // Retransmit service ID and last char
        platform_s_uart_send( SERMUX_PHYS_ID, uart_service_id_out );
        if( uart_last_sent & SERMUX_ESC_MASK )
          platform_s_uart_send( SERMUX_PHYS_ID, SERMUX_ESCAPE_CHAR );
        platform_s_uart_send( SERMUX_PHYS_ID, uart_last_sent & 0xFF );
        uart_last_sent = -1;
      }
      else
      {
        // Check for an escaped char
        if( uart_got_esc )
        {
          data ^= SERMUX_ESCAPE_XOR_MASK;
          uart_got_esc = 0;
        }
        if( uart_service_id_in == -1 ) // request full restransmit if needed
          platform_s_uart_send( SERMUX_PHYS_ID, SERMUX_FORCE_SID_CHAR );
        else
          buf_write( BUF_ID_UART, uart_service_id_in, ( t_buf_data* )&data );
      }
    }
    else
      uart_got_esc = 1;
  }
  else
#endif // #ifdef BUILD_SERMUX
  buf_write( BUF_ID_UART, usart_id, ( t_buf_data* )&data );
}