bdk: uart: use 2 STOP bits based on baudrate

This commit is contained in:
CTCaer 2022-05-14 12:25:02 +03:00
parent b56e788d12
commit 87fe374b3b

View file

@ -34,14 +34,17 @@ void uart_init(u32 idx, u32 baud, u32 mode)
// Set clock. // Set clock.
bool clk_type = clock_uart_use_src_div(idx, baud); bool clk_type = clock_uart_use_src_div(idx, baud);
// 2 STOP bits for rates > 1M. (Reduced efficiency but less errors on high baudrates).
u32 uart_lcr_stop = baud > 1000000 ? UART_LCR_STOP : 0;
// Misc settings. // Misc settings.
u32 div = clk_type ? ((8 * baud + 408000000) / (16 * baud)) : 1; // DIV_ROUND_CLOSEST. u32 div = clk_type ? ((8 * baud + 408000000) / (16 * baud)) : 1; // DIV_ROUND_CLOSEST.
uart->UART_IER_DLAB = 0; // Disable interrupts. uart->UART_IER_DLAB = 0; // Disable interrupts.
uart->UART_LCR = UART_LCR_DLAB | UART_LCR_WORD_LENGTH_8; // Enable DLAB & set 8n1 mode. uart->UART_LCR = UART_LCR_DLAB | UART_LCR_WORD_LENGTH_8; // Enable DLAB & set 8n1 mode.
uart->UART_THR_DLAB = (u8)div; // Divisor latch LSB. uart->UART_THR_DLAB = (u8)div; // Divisor latch LSB.
uart->UART_IER_DLAB = (u8)(div >> 8); // Divisor latch MSB. uart->UART_IER_DLAB = (u8)(div >> 8); // Divisor latch MSB.
// Disable DLAB and set 2 STOP bits (reduced efficiency but less errors on high baudrates). // Disable DLAB and set STOP bits setting if applicable.
uart->UART_LCR = UART_LCR_STOP | UART_LCR_WORD_LENGTH_8; uart->UART_LCR = uart_lcr_stop | UART_LCR_WORD_LENGTH_8;
(void)uart->UART_SPR; (void)uart->UART_SPR;
// Setup and flush fifo. // Setup and flush fifo.