void USART1_IRQHandler(void) 
{
	rt_uint8_t ch;
    rt_interrupt_enter();

    if( USART_GetITStatus( USART1, USART_IT_RXNE ) != RESET )
	{
		ch = USART_ReceiveData( USART1 );
		USART_ClearITPendingBit( USART1, USART_IT_RXNE );
		//rt_ringbuffer_putchar(&rb_vuart,ch);
		if(flag_bd_upgrade_uart==0)
		{
			rt_ringbuffer_putchar(&rb_vuart,ch);	
			//if (dev_vuart.rx_indicate != RT_NULL)  /*默认finsh使用*/
			{
				dev_vuart.rx_indicate(&dev_vuart,1);
			}
		}
#if 1		
		else	/*接收升级数据,由于串口波特率可变,需要同步到正确的数据头*/
		{
			switch(bd_packet_status)
			{
				case BD_SYNC_40:
					if(ch==0x40) 
					{
						rt_ringbuffer_init(&rb_vuart,vuart_rxbuf,VUART_RXBUF_SIZE);
						rt_ringbuffer_putchar(&rb_vuart,ch);
						bd_packet_status=BD_SYNC_0D;
					}
					break;
				case BD_SYNC_0D:
					if(ch==0x0D) bd_packet_status=BD_SYNC_0A;
					rt_ringbuffer_putchar(&rb_vuart,ch);
					break;
				case BD_SYNC_0A:
					if(ch==0x0A) bd_packet_status=BD_SYNC_40;
					else bd_packet_status=BD_SYNC_0D;
					rt_ringbuffer_putchar(&rb_vuart,ch);
					break;
			}

		}
#endif

	
    }	

    rt_interrupt_leave();

}
static int _vcom_putc(struct rt_serial_device *serial, char c)
{
    rt_uint32_t level;
    
    if (vcom_connected != RT_TRUE) return 0;
    
    level = rt_hw_interrupt_disable();
    if (RT_RINGBUFFER_EMPTY(&tx_ringbuffer))
    {
        rt_ringbuffer_putchar(&tx_ringbuffer, c);
    }
    rt_hw_interrupt_enable(level);     
    
    return 1;
}
Exemple #3
0
static rt_size_t telnet_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
{
    const rt_uint8_t *ptr;

    ptr = (rt_uint8_t*) buffer;

    rt_mutex_take(telnet->tx_ringbuffer_lock, RT_WAITING_FOREVER);
    while (size)
    {
        if (*ptr == '\n')
            rt_ringbuffer_putchar(&telnet->tx_ringbuffer, '\r');

        if (rt_ringbuffer_putchar(&telnet->tx_ringbuffer, *ptr) == 0) /* overflow */
            break;
        ptr++;
        size--;
    }
    rt_mutex_release(telnet->tx_ringbuffer_lock);

    /* send data to telnet client */
    send_to_client(telnet);

    return (rt_uint32_t) ptr - (rt_uint32_t) buffer;
}
Exemple #4
0
/***********************************************************
* Function:
* Description: uart4的中断服务函数
* Input:
* Input:
* Output:
* Return:
* Others:
***********************************************************/
void UART4_IRQHandler( void )
{
	rt_interrupt_enter( );
	if( USART_GetITStatus( UART4, USART_IT_RXNE ) != RESET )
	{
		rt_ringbuffer_putchar( &rb_uart4_rx, USART_ReceiveData( UART4 ) );
		USART_ClearITPendingBit( UART4, USART_IT_RXNE );
		//rt_sem_release( &sem_uart );
		last_tick = rt_tick_get( );
	}


/*
   if (USART_GetITStatus(UART4, USART_IT_TC) != RESET)
   {
   USART_ClearITPendingBit(UART4, USART_IT_TC);
   }
 */
	rt_interrupt_leave( );
}
static int _vcom_putc(struct rt_serial_device *serial, char c)
{
    rt_uint32_t level;
    int cnt;

    /*if (vcom_connected != RT_TRUE)
    {
        return 0;
    }*/

    /* if the buffer is full, there is a chance that the host would pull some
     * data out soon. But we cannot rely on that and if we wait to long, just
     * return. */
    for (cnt = 500;
         RT_RINGBUFFER_EMPTY(&tx_ringbuffer) == 0 && cnt;
         cnt--)
    {
        /*rt_kprintf("wait for %d\n", cnt);*/
        /*if (vcom_connected != RT_TRUE)
            return 0;*/
    }
    if (cnt == 0)
    {
        /* OK, we believe that the connection is lost. So don't send any more
         * data and act as the USB cable is not plugged in. Reset the VCOM
         * state machine */
        _vcom_reset_state();
        return 0;
    }

    level = rt_hw_interrupt_disable();
    if (RT_RINGBUFFER_EMPTY(&tx_ringbuffer))
    {
        rt_ringbuffer_putchar(&tx_ringbuffer, c);
    }
    rt_hw_interrupt_enable(level);

    return 1;
}
static void wrtnode2r_spi_stm32_set_read_buf_data(rt_uint8_t ch)
{
    rt_ringbuffer_putchar(&spi_bridge.read_buf, ch);
}
Exemple #7
0
/* process rx data */
static void process_rx(struct telnet_session* telnet, rt_uint8_t *data, rt_size_t length)
{
    rt_size_t rx_length, index;

    for (index = 0; index < length; index ++)
    {
        switch(telnet->state)
        {
        case STATE_IAC:
            if (*data == TELNET_IAC)
            {
                rt_mutex_take(telnet->rx_ringbuffer_lock, RT_WAITING_FOREVER);
                /* put buffer to ringbuffer */
                rt_ringbuffer_putchar(&(telnet->rx_ringbuffer), *data);
                rt_mutex_release(telnet->rx_ringbuffer_lock);

                telnet->state = STATE_NORMAL;
            }
            else
            {
                /* set telnet state according to received package */
                switch (*data)
                {
                case TELNET_WILL: telnet->state = STATE_WILL; break;
                case TELNET_WONT: telnet->state = STATE_WONT; break;
                case TELNET_DO:   telnet->state = STATE_DO; break;
                case TELNET_DONT: telnet->state = STATE_DONT; break;
                default: telnet->state = STATE_NORMAL; break;
                }
            }
            break;

        /* don't option */
        case STATE_WILL:
        case STATE_WONT:
            send_option_to_client(telnet, TELNET_DONT, *data);
            telnet->state = STATE_NORMAL;
            break;

        /* won't option */
        case STATE_DO:
        case STATE_DONT:
            send_option_to_client(telnet, TELNET_WONT, *data);
            telnet->state = STATE_NORMAL;
            break;

        case STATE_NORMAL:
            if (*data == TELNET_IAC) telnet->state = STATE_IAC;
            else if (*data != '\r') /* ignore '\r' */
            {
                rt_mutex_take(telnet->rx_ringbuffer_lock, RT_WAITING_FOREVER);
                /* put buffer to ringbuffer */
                rt_ringbuffer_putchar(&(telnet->rx_ringbuffer), *data);
                rt_mutex_release(telnet->rx_ringbuffer_lock);
            }
            break;
        }

        data ++;
    }

    rt_mutex_take(telnet->rx_ringbuffer_lock, RT_WAITING_FOREVER);
    /* get total size */
    rx_length = rt_ringbuffer_data_len(&telnet->rx_ringbuffer);
    rt_mutex_release(telnet->rx_ringbuffer_lock);

    /* indicate there are reception data */
    if ((rx_length > 0) && (telnet->device.rx_indicate != RT_NULL))
        telnet->device.rx_indicate(&telnet->device, rx_length);

    return;
}