/******************************************************************************* * Function Name : uart_irq_handler * Description : Interrupt handle function * Input : - Uart: Select the USART or the UART peripheral. * Output : None * Return : None *******************************************************************************/ void uart_irq_handler(const _Uart_Descriptor *Uart) { // __hw_enter_interrupt(); // if (*Uart->Ctrl && (*Uart->Ctrl)->DmaBufSize) { if (USART_GetITStatus(Uart->UARTx, USART_IT_IDLE) != RESET) // Idle line { NVIC_SetPendingIRQ(Uart->DMAx_IRQn); USART_ReceiveData(Uart->UARTx); } } else if (USART_GetITStatus(Uart->UARTx, USART_IT_RXNE) != RESET) // Received Data Ready to be Read { if (*Uart->Ctrl && ((*Uart->Ctrl)->RxCnt < (*Uart->Ctrl)->RxBufSize)) { (*Uart->Ctrl)->RxBufPtr[(*Uart->Ctrl)->RxiPut++] = (char)USART_ReceiveData(Uart->UARTx); //lepton if(!(*Uart->Ctrl)->RxCnt){ if(Uart->board_uart_info && Uart->board_uart_info->desc_r!=-1) __fire_io_int(ofile_lst[Uart->board_uart_info->desc_r].owner_pthread_ptr_read); } //lepton (*Uart->Ctrl)->RxCnt++; if ((*Uart->Ctrl)->RxiPut >= (*Uart->Ctrl)->RxBufSize) (*Uart->Ctrl)->RxiPut = 0; if (((*Uart->Ctrl)->HwCtrl & UART_HW_FLOW_CTRL_RX) && ((*Uart->Ctrl)->RxCnt > ((*Uart->Ctrl)->RxBufSize - (*Uart->Ctrl)->DmaBufSize))) uart_set_rx_hw_fc(Uart); } else USART_ClearITPendingBit(Uart->UARTx, USART_IT_RXNE); #ifdef _UART_OS_SUPPORT isr_evt_set((*Uart->Ctrl)->Event, (*Uart->Ctrl)->Task); #endif } if (USART_GetITStatus(Uart->UARTx, USART_IT_TXE) != RESET) // Transmit Data Register Empty { if (*Uart->Ctrl && (*Uart->Ctrl)->TxCnt) { USART_SendData(Uart->UARTx, (*Uart->Ctrl)->TxBufPtr[(*Uart->Ctrl)->TxiGet++]); (*Uart->Ctrl)->TxCnt--; if ((*Uart->Ctrl)->TxiGet >= (*Uart->Ctrl)->TxBufSize) (*Uart->Ctrl)->TxiGet = 0; } else{ USART_ITConfig(Uart->UARTx, USART_IT_TXE, DISABLE); //lepton if(Uart->board_uart_info && Uart->board_uart_info->desc_w!=-1) __fire_io_int(ofile_lst[Uart->board_uart_info->desc_w].owner_pthread_ptr_write); //lepton } } if (USART_GetITStatus(Uart->UARTx, USART_IT_TC) != RESET) // Transmission complete { if (*Uart->Ctrl && ((*Uart->Ctrl)->HwCtrl & UART_HALF_DUPLEX)) uart_tx_disable(Uart); USART_ClearITPendingBit(Uart->UARTx, USART_IT_TC); } // __hw_leave_interrupt(); }
/** @brief Network receive callback function @param[in] *arg: unused @param[in] *data: Data received @param[in] length: Length of data received @return void */ MEMSPACE static void tcp_data_receive_callback(void *arg, char *data, uint16_t length) { uint16_t current; uint8_t byte; // Echo debug #if 0 for(current = 0; current < length; current++) uart0_putc(data[current]); #endif // FIXME NOT WORKING // for(current = 0; (current < length) && queue_space(uart_send_queue); current++) { byte = (uint8_t)data[current]; queue_pushc(uart_send_queue, byte); } if(queue_empty(uart_send_queue) && tx_fifo_empty(0)) uart_tx_disable(0); else uart_tx_enable(0); }