/* UART receive/transmit interrupt handler for ring buffers */ void Chip_UART_IRQRBHandler(LPC_USART_T *pUART, RINGBUFF_T *pRXRB, RINGBUFF_T *pTXRB) { /* Handle transmit interrupt if enabled */ if (pUART->IER & UART_IER_THREINT) { Chip_UART_TXIntHandlerRB(pUART, pTXRB); /* Disable transmit interrupt if the ring buffer is empty */ if (RingBuffer_IsEmpty(pTXRB)) { Chip_UART_IntDisable(pUART, UART_IER_THREINT); } } /* Handle receive interrupt */ Chip_UART_RXIntHandlerRB(pUART, pRXRB); }
/* UART receive/transmit interrupt handler for ring buffers */ void Chip_UART_IRQRBHandler(LPC_USART_T *pUART, RINGBUFF_T *pRXRB, RINGBUFF_T *pTXRB) { /* Handle transmit interrupt if enabled */ if ((Chip_UART_GetStatus(pUART) & UART_STAT_TXRDY) != 0) { Chip_UART_TXIntHandlerRB(pUART, pTXRB); /* Disable transmit interrupt if the ring buffer is empty */ if (RingBuffer_IsEmpty(pTXRB)) { Chip_UART_IntDisable(pUART, UART_INTEN_TXRDY); } } /* Handle receive interrupt */ Chip_UART_RXIntHandlerRB(pUART, pRXRB); }
/* Populate a transmit ring buffer and start UART transmit */ uint32_t Chip_UART_SendRB(LPC_USART_T *pUART, RINGBUFF_T *pRB, const void *data, int bytes) { uint32_t ret; uint8_t *p8 = (uint8_t *) data; /* Don't let UART transmit ring buffer change in the UART IRQ handler */ Chip_UART_IntDisable(pUART, UART_IER_THREINT); /* Move as much data as possible into transmit ring buffer */ ret = RingBuffer_InsertMult(pRB, p8, bytes); Chip_UART_TXIntHandlerRB(pUART, pRB); /* Add additional data to transmit ring buffer if possible */ ret += RingBuffer_InsertMult(pRB, (p8 + ret), (bytes - ret)); /* Enable UART transmit interrupt */ Chip_UART_IntEnable(pUART, UART_IER_THREINT); return ret; }