2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: boot/armllb/hw/versatile/hwuart.c
5 * PURPOSE: LLB UART Initialization Routines for Versatile
6 * PROGRAMMERS: ReactOS Portable Systems Group
14 #define UART_PL01x_DR (LlbHwVersaUartBase + 0x00)
15 #define UART_PL01x_RSR (LlbHwVersaUartBase + 0x04)
16 #define UART_PL01x_ECR (LlbHwVersaUartBase + 0x04)
17 #define UART_PL01x_FR (LlbHwVersaUartBase + 0x18)
18 #define UART_PL011_IBRD (LlbHwVersaUartBase + 0x24)
19 #define UART_PL011_FBRD (LlbHwVersaUartBase + 0x28)
20 #define UART_PL011_LCRH (LlbHwVersaUartBase + 0x2C)
21 #define UART_PL011_CR (LlbHwVersaUartBase + 0x30)
22 #define UART_PL011_IMSC (LlbHwVersaUartBase + 0x38)
27 #define UART_PL011_LCRH_WLEN_8 0x60
28 #define UART_PL011_LCRH_FEN 0x10
33 #define UART_PL011_CR_UARTEN 0x01
34 #define UART_PL011_CR_TXE 0x100
35 #define UART_PL011_CR_RXE 0x200
40 #define UART_PL01x_FR_RXFE 0x10
41 #define UART_PL01x_FR_TXFF 0x20
43 static const ULONG LlbHwVersaUartBase
= 0x101F1000;
45 /* FUNCTIONS ******************************************************************/
49 LlbHwVersaUartInitialize(VOID
)
51 ULONG Divider
, Remainder
, Fraction
, ClockRate
, Baudrate
;
53 /* Query peripheral rate, hardcore baudrate */
54 ClockRate
= LlbHwGetPClk();
57 /* Calculate baudrate clock divider and remainder */
58 Divider
= ClockRate
/ (16 * Baudrate
);
59 Remainder
= ClockRate
% (16 * Baudrate
);
61 /* Calculate the fractional part */
62 Fraction
= (8 * Remainder
/ Baudrate
) >> 1;
63 Fraction
+= (8 * Remainder
/ Baudrate
) & 1;
65 /* Disable interrupts */
66 WRITE_REGISTER_ULONG(UART_PL011_CR
, 0);
68 /* Set the baud rate to 115200 bps */
69 WRITE_REGISTER_ULONG(UART_PL011_IBRD
, Divider
);
70 WRITE_REGISTER_ULONG(UART_PL011_FBRD
, Fraction
);
72 /* Set 8 bits for data, 1 stop bit, no parity, FIFO enabled */
73 WRITE_REGISTER_ULONG(UART_PL011_LCRH
,
74 UART_PL011_LCRH_WLEN_8
| UART_PL011_LCRH_FEN
);
76 /* Clear and enable FIFO */
77 WRITE_REGISTER_ULONG(UART_PL011_CR
,
78 UART_PL011_CR_UARTEN
|
85 LlbHwUartSendChar(IN CHAR Char
)
87 /* Send the character */
88 WRITE_REGISTER_ULONG(UART_PL01x_DR
, Char
);
93 LlbHwUartTxReady(VOID
)
95 /* TX output buffer is ready? */
96 return ((READ_REGISTER_ULONG(UART_PL01x_FR
) & UART_PL01x_FR_TXFF
) == 0);
101 LlbHwGetUartBase(IN ULONG Port
)