Modified IBL to re-init PLL in DDR controller, added UART
[keystone-rtos/ibl.git] / src / hw / uart / c66x_uart / evmc66x_uart.c
1 /******************************************************************************
2  * Copyright (c) 2011 Texas Instruments Incorporated - http://www.ti.com
3  *
4  *  Redistribution and use in source and binary forms, with or without
5  *  modification, are permitted provided that the following conditions
6  *  are met:
7  *
8  *    Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *
11  *    Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the
14  *    distribution.
15  *
16  *    Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  *****************************************************************************/
34 #include "evmc66x_uart.h"
36 static void uart_delay_cycles(uint32_t cycles)
37 {
38         while (cycles--) {
39                 asm ("NOP");
40         }
41 }
43 void uart_init(void)
44 {
45         uint16_t uiBaudRate;
46     uint8_t uiDLLVal = 0;
47     uint8_t uiDLHVal = 0;
49     // Allows access to the divisor latches of the baud generator during a
50     // read or write operation (DLL and DLH)
52     hUartRegs->LCR = 0x80;
54     // Set the baudrate,for accessing LCR[7] should be enable
55     hUartRegs->DLL  = DLL_VAL;
56     hUartRegs->DLH  = DLM_VAL;
58     // Allows access to the receiver buffer register (RBR),
59     // the transmitter holding register (THR), and the
60     // interrupt enable register (IER) selected.
61     hUartRegs->LCR = 0x18;
63     // Disable THR, RHR, Receiver line status interrupts
64     hUartRegs->IER = 0;
66     /* If autoflow control is desired,
67     * write appropriate values to the modem
68     * control register (MCR). Note that all UARTs
69     * do not support autoflow control, see
70     * the device-specific data manual for supported features.
71     *
72     * MCR
73     * ====================================================
74     * Bit  Field   Value   Description
75     * 5    AFE     0       Autoflow control is disabled
76     * 4    LOOP    0       Loop back mode is disabled.
77     * 1    RTS     0       RTS control (UARTn_RTS is disabled,
78     *                      UARTn_CTS is only enabled.)
79     * =====================================================
80     *
81     *
82     */
84     hUartRegs->MCR = 0;
86     /* Choose the desired response to
87     * emulation suspend events by configuring
88     * the FREE bit and enable the UART by setting
89     * the UTRST and URRST bits in the power and
90     * emulation management register (PWREMU_MGMT).
91     *
92     *
93     * PWREMU_MGMT
94     * =================================================
95     * Bit  Field   Value   Description
96     * 14   UTRST   1       Transmitter is enabled
97     * 13   URRST   1       Receiver is enabled
98     * 0    FREE    1       Free-running mode is enabled
99     * ===================================================
100     *
101     */
102     hUartRegs->PWREMU_MGMT = 0x6001;
104     /* Cleanup previous data (rx trigger is also set to 0)*/
105     /* Set FCR = 0x07;        */
106     hUartRegs->FCR = 0xC1;
108     /* Setting baud rate to 115200 */
109     uiBaudRate = 88;
111     /* Setting the baud rate */
112     hUartRegs->LCR = 0x80;
113     uiDLLVal = (uint8_t )(0x00FF & uiBaudRate);
114     uiDLHVal = (uint8_t )(0x00FF & (uiBaudRate  >> 8));
116     // Set the baudrate,for accessing LCR[7] should be enable
117     hUartRegs->DLL  = uiDLLVal;
118     hUartRegs->DLH  = uiDLHVal;
119     hUartRegs->LCR  = 0x03;
121     hUartRegs->LCR = 0x80;
122     uiDLLVal = (uint8_t )(0x00FF & uiBaudRate);
123     uiDLHVal = (uint8_t )(0x00FF & (uiBaudRate  >> 8));
124     // Set the baudrate,for accessing LCR[7] should be enable
125     hUartRegs->DLL  = uiDLLVal;
126     hUartRegs->DLH  = uiDLHVal;
127     hUartRegs->LCR = 0x03;
129     return;
132 /******************************************************************************
133  *
134  * Function:    uart_write_byte
135  *
136  * Description: This function writes a byte of data to UART device
137  *
138  * Parameters:  uint8_t uchAddress - Address of 8-bit register
139  *                              uint8_t uchByte -  8-bit data to write to THR
140  *
141  * Return Value: none
142  ******************************************************************************/
143 static void uart_write_byte(uint8_t uchByte)
145     while (!(hUartRegs->LSR & UART_LSR_THRE_MASK)) {
146         uart_delay_cycles(10000);
147     }
148     hUartRegs->THR = (UART_THR_DATA_MASK & uchByte);
149     return;
152 void uart_write_string(uint8_t * str, uint32_t length)
154         uint32_t i;
155         uart_write_byte((uint8_t)0x0D);
156         uart_write_byte((uint8_t)0x0A);
157         for(i = 0; i < length; i++)
158         {
159                 uart_write_byte(str[i]);
160         }