extern int32_t ciaaDriverUart_ioctl(ciaaDevices_deviceType const * const device, int32_t const request, void * param) { ciaaDriverUart_uartType * uart = device->layer; uint32_t baseAddr = g_uartBaseAddr[uart->instance]; uint32_t uartSourceClock; int32_t ret = -1; if((device == ciaaDriverUartConst.devices[0]) || (device == ciaaDriverUartConst.devices[1]) || (device == ciaaDriverUartConst.devices[2])) { switch(request) { /* signal to start transmition */ case ciaaPOSIX_IOCTL_STARTTX: ciaaDriverUart_txConfirmation(device); break; /* set serial port baudrate */ case ciaaPOSIX_IOCTL_SET_BAUDRATE: uart->config.baudRate = (uint32_t)(param); /* UART clock source is either system clock or bus clock depending on the instance */ uartSourceClock = CLOCK_SYS_GetUartFreq(uart->instance); if (kStatus_UART_Success == UART_HAL_SetBaudRate(baseAddr, uartSourceClock, uart->config.baudRate)) { ret = 0; } break; } } return ret; }
extern int32_t ciaaDriverUart_ioctl(ciaaDevices_deviceType const * const device, int32_t const request, void * param) { int32_t ret = -1; if((device == ciaaDriverUartConst.devices[0]) || (device == ciaaDriverUartConst.devices[1]) || (device == ciaaDriverUartConst.devices[2]) ) { switch(request) { case ciaaPOSIX_IOCTL_STARTTX: /* disable THRE irq (TX) */ Chip_UART_IntDisable((LPC_USART_T *)device->loLayer, UART_IER_THREINT); /* this one calls write */ ciaaDriverUart_txConfirmation(device); /* enable THRE irq (TX) */ Chip_UART_IntEnable((LPC_USART_T *)device->loLayer, UART_IER_THREINT); ret = 0; break; case ciaaPOSIX_IOCTL_SET_BAUDRATE: ret = Chip_UART_SetBaud((LPC_USART_T *)device->loLayer, (int32_t)param); break; case ciaaPOSIX_IOCTL_SET_FIFO_TRIGGER_LEVEL: Chip_UART_SetupFIFOS((LPC_USART_T *)device->loLayer, UART_FCR_FIFO_EN | UART_FCR_TX_RS | UART_FCR_RX_RS | (int32_t)param); break; case ciaaPOSIX_IOCTL_SET_ENABLE_TX_INTERRUPT: if((bool)(intptr_t)param == false) { /* disable THRE irq (TX) */ Chip_UART_IntDisable((LPC_USART_T *)device->loLayer, UART_IER_THREINT); } else { /* enable THRE irq (TX) */ Chip_UART_IntEnable((LPC_USART_T *)device->loLayer, UART_IER_THREINT); } break; case ciaaPOSIX_IOCTL_SET_ENABLE_RX_INTERRUPT: if((bool)(intptr_t)param == false) { /* disable RBR irq (RX) */ Chip_UART_IntDisable((LPC_USART_T *)device->loLayer, UART_IER_RBRINT); } else { /* enable RBR irq (RX) */ Chip_UART_IntEnable((LPC_USART_T *)device->loLayer, UART_IER_RBRINT); } break; } } return ret; }
void UART3_IRQHandler(void) { /* TODO check and call only rx or tx as corresponding */ ciaaDriverUart_rxIndication(&ciaaDriverUart_device2); ciaaDriverUart_txConfirmation(&ciaaDriverUart_device2); }