2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: boot/freeldr/arch/arm/omapuart.c
5 * PURPOSE: Implements code for TI OMAP3 boards using the 16550 UART
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
13 /* GLOBALS ********************************************************************/
18 #define UART0_RHR (ArmBoardBlock->UartRegisterBase + 0x00)
19 #define UART0_THR UART0_RHR
20 #define UART0_IER (ArmBoardBlock->UartRegisterBase + 0x04)
21 #define UART0_FCR (ArmBoardBlock->UartRegisterBase + 0x08)
22 #define UART0_LCR (ArmBoardBlock->UartRegisterBase + 0x0C)
23 #define UART0_MCR (ArmBoardBlock->UartRegisterBase + 0x10)
24 #define UART0_LSR (ArmBoardBlock->UartRegisterBase + 0x14)
25 #define UART0_MDR1 (ArmBoardBlock->UartRegisterBase + 0x20)
28 // When we enable the divisor latch
30 #define UART0_DLL UART0_RHR
31 #define UART0_DLH UART0_IER
36 #define FCR_FIFO_EN 0x01
43 #define LCR_WLS_8 0x03
44 #define LCR_1_STB 0x00
45 #define LCR_DIVL_EN 0x80
46 #define LCR_NO_PAR 0x00
63 #define MDR1_UART16X 1
65 #define MDR1_UART16X_AUTO_BAUD 3
66 #define MDR1_UART13X 4
70 #define MDR1_DISABLE 8
72 /* FUNCTIONS ******************************************************************/
75 ArmOmap3SerialInit(IN ULONG Baudrate
)
80 // Calculate baudrate clock divider to set the baud rate
82 BaudClock
= (ArmBoardBlock
->ClockRate
/ 16) / Baudrate
;
85 // Disable serial port
87 WRITE_REGISTER_UCHAR(UART0_MDR1
, MDR1_DISABLE
);
92 WRITE_REGISTER_UCHAR(UART0_IER
, 0);
95 // Set the baud rate to 115200 bps
97 WRITE_REGISTER_UCHAR(UART0_LCR
, LCR_DIVL_EN
);
98 WRITE_REGISTER_UCHAR(UART0_DLL
, BaudClock
);
99 WRITE_REGISTER_UCHAR(UART0_DLH
, (BaudClock
>> 8) & 0xFF);
104 WRITE_REGISTER_UCHAR(UART0_MCR
, MCR_DTR
| MCR_RTS
);
107 // Set 8 bits for data, 1 stop bit, no parity
109 WRITE_REGISTER_UCHAR(UART0_LCR
, LCR_WLS_8
| LCR_1_STB
| LCR_NO_PAR
);
112 // Clear and enable FIFO
114 WRITE_REGISTER_UCHAR(UART0_FCR
, FCR_FIFO_EN
| FCR_RXSR
| FCR_TXSR
);
117 // Enable serial port
119 WRITE_REGISTER_UCHAR(UART0_MDR1
, MDR1_UART16X
);
123 ArmOmap3PutChar(IN INT Char
)
126 // Properly support new-lines
128 if (Char
== '\n') ArmOmap3PutChar('\r');
133 while ((READ_REGISTER_UCHAR(UART0_LSR
) & LSR_THRE
) == 0);
136 // Send the character
138 WRITE_REGISTER_UCHAR(UART0_THR
, Char
);
147 while ((READ_REGISTER_UCHAR(UART0_LSR
) & LSR_DR
) == 0);
150 // Read the character
152 return READ_REGISTER_UCHAR(UART0_RHR
);
159 // Return if something is ready
161 return ((READ_REGISTER_UCHAR(UART0_LSR
) & LSR_DR
) != 0);