UART: Start adding UART code
[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 "platform_internal.h"
36 #if (PLATFORM_UART_IN)
38 /******************************************************************************
39  *
40  * File Name:   evmc66x_uart.c
41  *
42  * Description: This file contains APIs for  UART. 
43  * 
44  * 
45  ******************************************************************************/
47 /************************
48  * Include Files
49  ************************/
51 /******************************************************************************
52  * 
53  * Function:    UartInit  
54  *
55  * Description: This function initializes the UART. 
56  *
57  * Parameters:  void
58  *
59  * Return Value: void
60  * 
61  ******************************************************************************/
62 void UartInit(void)
63 {
64     //      Allows access to the divisor latches of the baud generator during a 
65     // read or write operation (DLL and DLH)
66     CSL_FINS (hUartRegs->LCR, UART_LCR_DLAB, CSL_UART_LCR_DLAB_ENABLE);
67     //      Break condition is disabled.
68     CSL_FINS (hUartRegs->LCR, UART_LCR_BC,   CSL_UART_LCR_BC_DISABLE);
69     //      Stick parity is disabled.
70     CSL_FINS (hUartRegs->LCR, UART_LCR_SP,   CSL_UART_LCR_SP_DISABLE);
71     //      Odd parity is selected
72     CSL_FINS (hUartRegs->LCR, UART_LCR_EPS,  CSL_UART_LCR_EPS_ODD);
73     //      No PARITY bit is transmitted or checked
74     CSL_FINS (hUartRegs->LCR, UART_LCR_PEN,  CSL_UART_LCR_PEN_DISABLE);    
76     // Set the baudrate,for accessing LCR[7] should be enable 
77     hUartRegs->DLL  = DLL_VAL;
78     hUartRegs->DLH  = DLM_VAL;
80     // Allows access to the receiver buffer register (RBR), 
81     // the transmitter holding register (THR), and the
82     // interrupt enable register (IER) selected.
83     CSL_FINS (hUartRegs->LCR, UART_LCR_DLAB, CSL_UART_LCR_DLAB_DISABLE);
84     // Even Parity is selected
85     CSL_FINS (hUartRegs->LCR, UART_LCR_EPS, CSL_UART_LCR_EPS_EVEN);
86     // Parity Enable 
87     CSL_FINS (hUartRegs->LCR, UART_LCR_PEN, CSL_UART_LCR_PEN_ENABLE);
88  
89     // Disable THR, RHR, Receiver line status interrupts
90     CSL_FINS (hUartRegs->IER, UART_IER_ERBI,  CSL_UART_IER_ERBI_DISABLE);
91     CSL_FINS (hUartRegs->IER, UART_IER_ETBEI, CSL_UART_IER_ETBEI_DISABLE);
92     CSL_FINS (hUartRegs->IER, UART_IER_ELSI,  CSL_UART_IER_ELSI_DISABLE);
93     CSL_FINS (hUartRegs->IER, UART_IER_EDSSI, CSL_UART_IER_EDSSI_DISABLE);  
95     /* If autoflow control is desired, 
96     * write appropriate values to the modem 
97     * control register (MCR). Note that all UARTs 
98     * do not support autoflow control, see 
99     * the device-specific data manual for supported features.
100     * 
101     * MCR
102     * ====================================================
103     * Bit  Field   Value   Description
104     * 5    AFE     0       Autoflow control is disabled
105     * 4    LOOP    0       Loop back mode is disabled.
106     * 1    RTS     0       RTS control (UARTn_RTS is disabled, 
107     *                      UARTn_CTS is only enabled.)
108     * =====================================================
109     * 
110     * 
111     */
113     hUartRegs->MCR = 0;
115     /* Choose the desired response to 
116     * emulation suspend events by configuring 
117     * the FREE bit and enable the UART by setting 
118     * the UTRST and URRST bits in the power and 
119     * emulation management register (PWREMU_MGMT).
120     * 
121     * 
122     * PWREMU_MGMT
123     * =================================================
124     * Bit  Field   Value   Description
125     * 14   UTRST   1       Transmitter is enabled
126     * 13   URRST   1       Receiver is enabled
127     * 0    FREE    1       Free-running mode is enabled
128     * ===================================================
129     * 
130     */
131     hUartRegs->PWREMU_MGMT = 0x6001;
133     /* Cleanup previous data (rx trigger is also set to 0)*/
134     /* Set FCR = 0x07;        */
135     CSL_FINS (hUartRegs->FCR, UART_FCR_FIFOEN,   CSL_UART_FCR_FIFOEN_ENABLE);
136     CSL_FINS (hUartRegs->FCR, UART_FCR_TXCLR,    CSL_UART_FCR_TXCLR_CLR);
137     CSL_FINS (hUartRegs->FCR, UART_FCR_RXCLR,    CSL_UART_FCR_RXCLR_CLR);
138     CSL_FINS (hUartRegs->FCR, UART_FCR_DMAMODE1, CSL_UART_FCR_DMAMODE1_DISABLE);
139     CSL_FINS (hUartRegs->FCR, UART_FCR_RXFIFTL,  CSL_UART_FCR_RXFIFTL_CHAR1);
141     return;
144 /******************************************************************************
145  * 
146  * Function:    UartSetBaudRate  
147  *
148  * Description: This function sets the UART baudrate. 
149  *
150  * Parameters:  UINT16 uiBaudRate - baudrate to set
151  *
152  * Return Value: void
153  * 
154  ******************************************************************************/
155 void UartSetBaudRate(uint16_t uiBaudRate)
157     uint8_t uiDLLVal = 0;
158     uint8_t uiDLHVal = 0;
160     hUartRegs->LCR = 0x80;
161     uiDLLVal = (uint8_t )(0x00FF & uiBaudRate);
162     uiDLHVal = (uint8_t )(0x00FF & (uiBaudRate  >> 8));
164     // Set the baudrate,for accessing LCR[7] should be enable 
165     hUartRegs->DLL  = uiDLLVal;
166     hUartRegs->DLH  = uiDLHVal;
167     hUartRegs->LCR = 0x03;
170 /******************************************************************************
171  * 
172  * Function:    UartReadBaudRate  
173  *
174  * Description: This function reads the UART baudrate. 
175  *
176  * Parameters:  UART_device eUartDevice - Uart Device
177  *
178  * Return Value: UINT16 - 16 bit Baudrate read from UART
179  * 
180  ******************************************************************************/
181 uint16_t UartReadBaudRate(void)
183     uint16_t ushBaudrate = 0;
184     uint16_t ushTemp = 0;
186     hUartRegs->LCR = 0x80;
187     // Read the baudrate 
188     ushBaudrate = hUartRegs->DLL;
189     ushTemp     = hUartRegs->DLH;
190     ushBaudrate = (ushBaudrate & 0xFF) | ((ushTemp & 0xFF) << 8); 
191     hUartRegs->LCR = 0x03;
192     return ushBaudrate;
195 /******************************************************************************
196  * 
197  * Function:    UartReadData  
198  *
199  * Description: This function reads a byte of data from I2C UART device  
200  * 
201  * Return Value: uint8_t - 8-bit value read from the RBR register
202  ******************************************************************************/
203 uint8_t UartReadData(void)
205         uint8_t uRcvChar = 0;
206         
207         uRcvChar = CSL_FEXT(hUartRegs->RBR, UART_RBR_DATA);
208         
209         return uRcvChar;
212 /******************************************************************************
213  * 
214  * Function:    UartWriteData
215  *
216  * Description: This function writes a byte of data to UART device  
217  * 
218  * Parameters:  uint8_t uchAddress - Address of 8-bit register
219  *                              uint8_t uchByte -  8-bit data to write to THR
220  *
221  * Return Value: none
222  ******************************************************************************/
223 void UartWriteData(uint8_t uchByte)
226     while (!(CSL_FEXT(hUartRegs->LSR, UART_LSR_THRE))) {
227                 platform_delaycycles(10000);
228     }
229     CSL_FINS(hUartRegs->THR, UART_THR_DATA, uchByte);
230     return;
235 /******************************************************************************
236  * 
237  * Function:    UartIsDataReady
238  *
239  * Description: This function gets the status of DR bit  
240  * 
241  * Parameters:  none
242  * 
243  * Return Value: Status of DR bit
244  *                              
245  ******************************************************************************/
246 Bool UartIsDataReady(void)
248         Bool DR_val = FALSE;
249         
250         if (CSL_UART_LSR_DR_READY == (CSL_FEXT(hUartRegs->LSR, UART_LSR_DR))) {
251         DR_val  = TRUE;
252     }
253         
254         return (DR_val);
256 /* Nothing past this point */
258 #endif