Exemple #1
0
void console_putc(unsigned int ch, char c)
{
	struct console_device *cdev;
	int init = INITDATA(initialized);

	switch (init) {
	case CONSOLE_UNINITIALIZED:
		kfifo_putc(console_output_buffer, c);
		return;

#ifdef CONFIG_HAS_EARLY_INIT
	case CONSOLE_INIT_EARLY:
		early_console_putc(INITDATA(early_console_base), c);
		return;
#endif

	case CONSOLE_INIT_FULL:
		for_each_console(cdev) {
			if (cdev->f_active & ch) {
				if (c == '\n')
					cdev->putc(cdev, '\r');
				cdev->putc(cdev, c);
			}
		}
		return;
	default:
		/* If we have problems inititalizing our data
		 * get them early
		 */
		hang();
	}
}
Exemple #2
0
int getc(void)
{
	unsigned char ch;
	uint64_t start;

	/*
	 * For 100us we read the characters from the serial driver
	 * into a kfifo. This helps us not to lose characters
	 * in small hardware fifos.
	 */
	start = get_time_ns();
	while (1) {
		if (tstc()) {
			kfifo_putc(console_input_buffer, getc_raw());

			start = get_time_ns();
		}
		if (is_timeout(start, 100 * USECOND) &&
				kfifo_len(console_input_buffer))
			break;
	}

	kfifo_getc(console_input_buffer, &ch);
	return ch;
}
Exemple #3
0
void console_putc(unsigned int ch, char c)
{
	struct console_device *cdev;
	int init = initialized;

	switch (init) {
	case CONSOLE_UNINITIALIZED:
		console_init_early();
		/* fall through */

	case CONSOLE_INITIALIZED_BUFFER:
		kfifo_putc(console_output_fifo, c);
		PUTC_LL(c);
		return;

	case CONSOLE_INIT_FULL:
		for_each_console(cdev) {
			if (cdev->f_active & ch) {
				if (c == '\n')
					cdev->putc(cdev, '\r');
				cdev->putc(cdev, c);
			}
		}
		return;
	default:
		/* If we have problems inititalizing our data
		 * get them early
		 */
		hang();
	}
}
Exemple #4
0
void  console_putc(char ch)
{
	if(console_dev){
		usart_sendbyte(console_dev,ch);
	}else{
		if(console_fifo==NULL)
			console_alloc_kfifo();
		if(console_fifo){
			kfifo_putc(console_fifo,ch);
		}
	}
}
Exemple #5
0
void USART1_IRQHandler(void)
{

	SysIntEnter();																					//任务优先级调度保护					
	
	//接收中断触发

	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		//数据接收动作
		rx_char = USART1_GETCHAR();
#if 0
		if( check_data(rx_char) != 0)
		{
			  rx_char = rx_char;
		}
#endif
		kfifo_putc( &rx_fifo,  rx_char);

		#if(USART1_RX_MODE==RX_PACKET_MODE)		//包数据检测机制的话,复位超时计数器,等待下一个接收的字符
		{
					TIM3->CCR1 = TIM3->CNT + TimeVal;										//重新增加超时量

					//接收第一个数据时,开启超时中断,接收完成该中断会有定时中断程序关闭
					if((TIM3->DIER & TIM_FLAG_CC1) == 0)   							//如果比较通道使能为关闭
					{	 			
						TIM3->SR = (uint16_t)~TIM_FLAG_CC1;								//清空比较通道1的中断标志 
						TIM3->DIER |= TIM_IT_CC1;													//比较通道打开等待下一次中断
					}
		}
		#elif(USART1_RX_MODE==RX_LENGTH_MODE)
		 {
			  int len = kfifo_len(&rx_fifo);

				if( len  == rx_length )
				{
					  rx_length = 0;
						SysMboxPost(rx_event, (void *)(&rx_char));	//发送激活等待的邮箱信号  
				}
				else if(len >= MAX_RX_BUFF_SIZE)
				{

					  SysMboxPost(rx_event, (void *)(&rx_char));	//发送激活等待的邮箱信号  
				}
		 }
		 #elif(USART1_RX_MODE==RX_KEY_MODE)
		 {
				if(rx_char == key_char)
				{
					SysMboxPost(rx_event, (void *)&rx_char);	//发送激活等待的邮箱信号
					
				}
		 }
		 #endif

	}
	//当接收移位寄存器中收完了数据,准备将数据往DR寄存器中放的时候,发现RNXE标志没有被清空,就会触发此中断
	
	else if(USART_GetFlagStatus(USART1, USART_IT_ORE) == SET)		//检测是否有接收溢出
  {
			USART1_GETCHAR();																//清接收溢出标志,只能用读数据的方式来清溢出标志
  }
	
	//发送中断触发

	if(USART_GetITStatus(USART1, USART_IT_TXE) == SET)					//发送中断
	{		

			if(-1 == kfifo_getc(&tx_fifo,&tx_char)) //fifo中没有数据了
			{	
				//禁止发送中断
				
				USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
				if(tx_event)
				{
					  SysMboxPost(tx_event, (void *)&tx_char);	//发送激活等待的邮箱信号
				}
			}
			else
			{
					//还有数据,继续发送fifo中的数据
					USART1_PUTCHAR(tx_char);
			}		
	
	}

	
	SysIntExit();   																						//任务优先级调度保护解除
}
Exemple #6
0
void USART1_IRQHandler(void)
{
	u16 state;
	
	SysIntEnter();																					//任务优先级调度保护					
	
	//接收中断触发
	
	state = USART1->SR;
	if((state&0x20) != 0)
	{
		//数据接收动作
		rx_char = USART1_GETCHAR();
		#if 0
			if( check_data(rx_char) != 0)
			{
					rx_char = rx_char;
			}
		#endif
		kfifo_putc( &rx_fifo,  rx_char);

		#if(RX_MODE==RX_PACKET_MODE)		//包数据检测机制的话,复位超时计数器,等待下一个接收的字符
		{
					TIM3->CCR1 = TIM3->CNT + TimeVal;										//重新增加超时量

					//接收第一个数据时,开启超时中断,接收完成该中断会有定时中断程序关闭
					if((TIM3->DIER & TIM_FLAG_CC1) == 0)   							//如果比较通道使能为关闭
					{	 			
						TIM3->SR = (uint16_t)~TIM_FLAG_CC1;								//清空比较通道1的中断标志 
						TIM3->DIER |= TIM_IT_CC1;													//比较通道打开等待下一次中断
					}
		}
		#elif(USART1_RX_MODE==RX_LENGTH_MODE)
		 {
			  int len = kfifo_len(&rx_fifo);

				if( len  == rx_length )
				{
					  rx_length = 0;
						SysMboxPost(rx_event, (void *)(&rx_char));	//发送激活等待的邮箱信号  
				}
				else if(len >= MAX_RX_BUFF_SIZE)
				{

					  SysMboxPost(rx_event, (void *)(&rx_char));	//发送激活等待的邮箱信号  
				}
		 }
		 #elif(USART1_RX_MODE==RX_KEY_MODE)
		 {
				if(rx_char == key_char)
				{
					SysMboxPost(rx_event, (void *)&rx_char);	//发送激活等待的邮箱信号
					
				}
		 }
		 #endif

	}
	
	
	else
	{
		state = USART1->SR;
		if( (state&0x08) != 0 )
		{
				USART1_GETCHAR();																//清接收溢出标志,只能用读数据的方式来清溢出标志
		}
	}
	//发送中断触发

	state = USART1->SR;
	if(( state&0x80 ) != 0 )
	{		

			if(-1 == kfifo_getc(&tx_fifo,&ch)) //fifo中没有数据了
			{	
				//禁止发送中断
				
				USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
				if(tx_event)
				{
					  SysMboxPost(tx_event, (void *)&tx_char);	//发送激活等待的邮箱信号
				}
			}
			else
			{
				//还有数据,继续发送fifo中的数据
				USART1_PUTCHAR(ch);
			}		
	
	}

	
	SysIntExit();   																						//任务优先级调度保护解除
}