void serial_init(serial_t *obj, PinName tx, PinName rx) { uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX); uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX); obj->index = pinmap_merge(uart_tx, uart_rx); MBED_ASSERT((int)obj->index != NC); uart_config_t config; UART_GetDefaultConfig(&config); config.baudRate_Bps = 9600; config.enableTx = false; config.enableRx = false; UART_Init(uart_addrs[obj->index], &config, CLOCK_GetFreq(uart_clocks[obj->index])); pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); if (tx != NC) { UART_EnableTx(uart_addrs[obj->index], true); pin_mode(tx, PullUp); } if (rx != NC) { UART_EnableRx(uart_addrs[obj->index], true); pin_mode(rx, PullUp); } if (obj->index == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
int hal_uart_close(int port) { struct hal_uart *u; if (port >= FSL_FEATURE_SOC_UART_COUNT) { return -1; } u = &uarts[port]; if (!u->u_open) { return -1; } u->u_open = 0; UART_DisableInterrupts(u->u_base, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable | kUART_TxDataRegEmptyInterruptEnable); DisableIRQ(u->u_irq); UART_EnableTx(u->u_base, false); UART_EnableRx(u->u_base, false); return 0; }
int hal_uart_config(int port, int32_t speed, uint8_t databits, uint8_t stopbits, enum hal_uart_parity parity, enum hal_uart_flow_ctl flow_ctl) { struct hal_uart *u; uart_config_t uconfig; if (port >= FSL_FEATURE_SOC_UART_COUNT) { return -1; } u = &uarts[port]; if (!u->u_configured || u->u_open) { return -1; } /* PIN config (all UARTs use kPORT_MuxAlt3) */ CLOCK_EnableClock(u->p_clock); PORT_SetPinMux(u->p_base, u->u_pin_rx, kPORT_MuxAlt3); PORT_SetPinMux(u->p_base, u->u_pin_tx, kPORT_MuxAlt3); /* UART CONFIG */ UART_GetDefaultConfig(&uconfig); uconfig.baudRate_Bps = speed; /* TODO: only handles 8 databits currently */ switch (stopbits) { case 1: uconfig.stopBitCount = kUART_OneStopBit; break; case 2: uconfig.stopBitCount = kUART_TwoStopBit; break; default: return -1; } switch (parity) { case HAL_UART_PARITY_NONE: uconfig.parityMode = kUART_ParityDisabled; break; case HAL_UART_PARITY_ODD: uconfig.parityMode = kUART_ParityOdd; break; case HAL_UART_PARITY_EVEN: uconfig.parityMode = kUART_ParityEven; break; } /* TODO: HW flow control not supported */ assert(flow_ctl == HAL_UART_FLOW_CTL_NONE); u->u_open = 1; u->u_tx_started = 0; NVIC_SetVector(u->u_irq, (uint32_t)s_uartirqs[port]); /* Initialize UART device */ UART_Init(u->u_base, &uconfig, CLOCK_GetFreq(u->clk_src)); UART_EnableTx(u->u_base, true); UART_EnableRx(u->u_base, true); UART_EnableInterrupts(u->u_base, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable); EnableIRQ(u->u_irq); return 0; }