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(); } }
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; }
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(); } }
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); } } }
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(); //任务优先级调度保护解除 }
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(); //任务优先级调度保护解除 }