void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { IRQn_Type uart_irqs[] = LPUART_RX_TX_IRQS; uint32_t vector = 0; switch (obj->index) { case 0: vector = (uint32_t)&uart0_irq; break; case 1: vector = (uint32_t)&uart1_irq; break; default: break; } if (enable) { switch (irq) { case RxIrq: LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable); break; case TxIrq: LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable); break; default: break; } NVIC_SetVector(uart_irqs[obj->index], vector); NVIC_EnableIRQ(uart_irqs[obj->index]); } else { // disable int all_disabled = 0; SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq); switch (irq) { case RxIrq: LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable); break; case TxIrq: LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable); break; default: break; } switch (other_irq) { case RxIrq: all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_RxDataRegFullInterruptEnable) == 0); break; case TxIrq: all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_TxDataRegEmptyInterruptEnable) == 0); break; default: break; } if (all_disabled) NVIC_DisableIRQ(uart_irqs[obj->index]); } }
static void mcux_lpuart_irq_rx_enable(struct device *dev) { const struct mcux_lpuart_config *config = dev->config->config_info; u32_t mask = kLPUART_RxDataRegFullInterruptEnable; LPUART_EnableInterrupts(config->base, mask); }
static rt_err_t imxrt_control(struct rt_serial_device *serial, int cmd, void *arg) { struct imxrt_uart *uart; RT_ASSERT(serial != RT_NULL); uart = (struct imxrt_uart *)serial->parent.user_data; switch (cmd) { case RT_DEVICE_CTRL_CLR_INT: /* disable interrupt */ LPUART_DisableInterrupts(uart->uart_base, kLPUART_RxDataRegFullInterruptEnable); /* disable rx irq */ DisableIRQ(uart->irqn); break; case RT_DEVICE_CTRL_SET_INT: /* enable interrupt */ LPUART_EnableInterrupts(uart->uart_base, kLPUART_RxDataRegFullInterruptEnable); /* enable rx irq */ EnableIRQ(uart->irqn); break; } return RT_EOK; }
static rt_err_t imxrt_configure(struct rt_serial_device *serial, struct serial_configure *cfg) { struct imxrt_uart *uart; lpuart_config_t config; RT_ASSERT(serial != RT_NULL); RT_ASSERT(cfg != RT_NULL); uart = (struct imxrt_uart *)serial->parent.user_data; imxrt_uart_gpio_init(uart); LPUART_GetDefaultConfig(&config); config.baudRate_Bps = cfg->baud_rate; switch (cfg->data_bits) { case DATA_BITS_7: config.dataBitsCount = kLPUART_SevenDataBits; break; default: config.dataBitsCount = kLPUART_EightDataBits; break; } switch (cfg->stop_bits) { case STOP_BITS_2: config.stopBitCount = kLPUART_TwoStopBit; break; default: config.stopBitCount = kLPUART_OneStopBit; break; } switch (cfg->parity) { case PARITY_ODD: config.parityMode = kLPUART_ParityOdd; break; case PARITY_EVEN: config.parityMode = kLPUART_ParityEven; break; default: config.parityMode = kLPUART_ParityDisabled; break; } config.enableTx = true; config.enableRx = true; LPUART_Init(uart->uart_base, &config, GetUartSrcFreq()); LPUART_EnableInterrupts(uart->uart_base, kLPUART_RxDataRegFullInterruptEnable); return RT_EOK; }
static void mcux_lpuart_irq_err_enable(struct device *dev) { const struct mcux_lpuart_config *config = dev->config->config_info; u32_t mask = kLPUART_NoiseErrorInterruptEnable | kLPUART_FramingErrorInterruptEnable | kLPUART_ParityErrorInterruptEnable; LPUART_EnableInterrupts(config->base, mask); }
void modem_init() { const gpio_pin_config_t OUTTRUE = {kGPIO_DigitalOutput, true}; const gpio_pin_config_t IN = {kGPIO_DigitalInput, false}; // initialize BOARD_CELL pins CLOCK_EnableClock(BOARD_CELL_UART_PORT_CLOCK); PORT_SetPinMux(BOARD_CELL_UART_PORT, BOARD_CELL_UART_TX_PIN, BOARD_CELL_UART_TX_ALT); PORT_SetPinMux(BOARD_CELL_UART_PORT, BOARD_CELL_UART_RX_PIN, BOARD_CELL_UART_RX_ALT); CLOCK_EnableClock(BOARD_CELL_PIN_PORT_CLOCK); PORT_SetPinMux(BOARD_CELL_PIN_PORT, BOARD_CELL_STATUS_PIN, kPORT_MuxAsGpio); GPIO_PinInit(BOARD_CELL_PIN_GPIO, BOARD_CELL_STATUS_PIN, &IN); #if BOARD_CELL_RESET_PIN PORT_SetPinMux(BOARD_CELL_PIN_PORT, BOARD_CELL_RESET_PIN, kPORT_MuxAsGpio); GPIO_PinInit(BOARD_CELL_PIN_GPIO, BOARD_CELL_RESET_PIN, &OUTTRUE); #endif PORT_SetPinMux(BOARD_CELL_PIN_PORT, BOARD_CELL_PWRKEY_PIN, kPORT_MuxAsGpio); GPIO_PinInit(BOARD_CELL_PIN_GPIO, BOARD_CELL_PWRKEY_PIN, &OUTTRUE); // the ring identifier is optional, only use if a pin and port exists #if BOARD_CELL_RI_PIN PORT_SetPinMux(BOARD_CELL_PIN_PORT, BOARD_CELL_RI_PIN, kPORT_MuxAsGpio); GPIO_PinInit(BOARD_CELL_PIN_GPIO, BOARD_CELL_RI_PIN, &IN); #endif #if BOARD_CELL_PWR_DOMAIN const gpio_pin_config_t OUTFALSE = {kGPIO_DigitalOutput, false}; CLOCK_EnableClock(BOARD_CELL_PWR_EN_CLOCK); PORT_SetPinMux(BOARD_CELL_PWR_EN_PORT, BOARD_CELL_PWR_EN_PIN, kPORT_MuxAsGpio); GPIO_PinInit(BOARD_CELL_PWR_EN_GPIO, BOARD_CELL_PWR_EN_PIN, &OUTFALSE); #endif // configure uart driver connected to the SIM800H lpuart_config_t lpuart_config; LPUART_GetDefaultConfig(&lpuart_config); lpuart_config.baudRate_Bps = 115200; lpuart_config.parityMode = kLPUART_ParityDisabled; lpuart_config.stopBitCount = kLPUART_OneStopBit; LPUART_Init(BOARD_CELL_UART, &lpuart_config, BOARD_CELL_PORT_CLOCK_FREQ); LPUART_EnableRx(BOARD_CELL_UART, true); LPUART_EnableTx(BOARD_CELL_UART, true); LPUART_EnableInterrupts(BOARD_CELL_UART, kLPUART_RxDataRegFullInterruptEnable); EnableIRQ(BOARD_CELL_UART_IRQ); }
/*! * @brief Main function */ int main(void) { lpuart_config_t config; BOARD_InitPins(); BOARD_BootClockRUN(); CLOCK_SetLpuart1Clock(1U); /* * config.baudRate_Bps = 115200U; * config.parityMode = kLPUART_ParityDisabled; * config.stopBitCount = kLPUART_OneStopBit; * config.txFifoWatermark = 0; * config.rxFifoWatermark = 0; * config.enableTx = false; * config.enableRx = false; */ LPUART_GetDefaultConfig(&config); config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE; config.enableTx = true; config.enableRx = true; LPUART_Init(DEMO_LPUART, &config, CLOCK_GetFreq(DEMO_LPUART_CLKSRC)); /* Send g_tipString out. */ LPUART_WriteBlocking(DEMO_LPUART, g_tipString, sizeof(g_tipString) / sizeof(g_tipString[0])); /* Enable RX interrupt. */ LPUART_EnableInterrupts(DEMO_LPUART, kLPUART_RxDataRegFullInterruptEnable); EnableIRQ(DEMO_LPUART_IRQn); while (1) { /* Send data only when LPUART TX register is empty and ring buffer has data to send out. */ while ((kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(DEMO_LPUART)) && (rxIndex != txIndex)) { LPUART_WriteByte(DEMO_LPUART, demoRingBuffer[txIndex]); txIndex++; txIndex %= DEMO_RING_BUFFER_SIZE; } } }