UART: Start adding UART code
[keystone-rtos/ibl.git] / src / hw / uart / i2c_uart / i2c_uart.c
1 /******************************************************************************
2  * Copyright (c) 2010 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 /******************************************************************************
35  *
36  * File Name:   evmc64x_i2c_uart.c
37  *
38  * Description: This file contains APIs for I2C UART. 
39  * 
40  * History:             
41  *              AUG/11/2009, Amit Solanki,      Created the file
42  *              SEP/01/2009, Amit Solanki,  Updated the documentation
43  * 
44  ******************************************************************************/
46 /************************
47  * Include Files
48  ************************/
49 #include "evmc64x.h"
50 #include "evmc64x_i2c.h"
51 #include "evmc64x_i2c_uart.h"
53 /******************************************************************************
54  * 
55  * Function:    i2cUartInit  
56  *
57  * Description: This function initializes the UART. 
58  *
59  * Parameters:  void
60  *
61  * Return Value: void
62  * 
63  ******************************************************************************/
64 void i2cUartInit(UART_device eUartDevice)
65 {
66         // Enable the Divisor lathc bit in LCR for accessing special register(DLL,DLH)
67         i2cUartWrite (eUartDevice, LCR, 0x80);  
68         // Set the baudrate,for accessing LCR[7] should be enable 
69         i2cUartWrite (eUartDevice, DLL, DLL_VAL);       
70         i2cUartWrite (eUartDevice, DLM, DLM_VAL);
72         // 8-bits
73         i2cUartWrite (eUartDevice, LCR, 0x03);  
74                  
75         // Disable THR and RHR interrupt
76     i2cUartWrite (eUartDevice, IER, 0x00);
77     
78     // set all GPIO as 1
79     i2cUartWrite (eUartDevice, IOSTATE, 0xFF);
80     // Set GPIO direction as ouput
81     i2cUartWrite (eUartDevice, IODIR, 0xFF);
82 }
84 /******************************************************************************
85  * 
86  * Function:    i2cUartSetBaudRate  
87  *
88  * Description: This function sets the UART baudrate. 
89  *
90  * Parameters:  UINT16 uiBaudRate - baudrate to set
91  *
92  * Return Value: void
93  * 
94  ******************************************************************************/
95 void i2cUartSetBaudRate(UART_device eUartDevice, UINT16 uiBaudRate)
96 {
97         UINT8 uiDLLVal = 0;
98         UINT8 uiDLHVal = 0;
99         
100         // Enable the Divisor lathc bit in LCR for 
101         // accessing special register(DLL,DLH)
102         i2cUartWrite (eUartDevice, LCR, 0x80);
103         uiDLLVal = (UINT8 )(0x00FF & uiBaudRate);       
104         uiDLHVal = (UINT8 )(0xFF00 & uiBaudRate) >> 8;
105         
106         // Set the baudrate,for accessing LCR[7] should be enable 
107         i2cUartWrite (eUartDevice, DLL, uiDLLVal);      
108         i2cUartWrite (eUartDevice, DLM, uiDLHVal);
110         // 8-bits
111         i2cUartWrite (eUartDevice, LCR, 0x03);  
114 /******************************************************************************
115  * 
116  * Function:    i2cUartReadBaudRate  
117  *
118  * Description: This function reads the UART baudrate. 
119  *
120  * Parameters:  UART_device eUartDevice - Uart Device
121  *
122  * Return Value: UINT16 - 16 bit Baudrate read from UART
123  * 
124  ******************************************************************************/
125 UINT16 i2cUartReadBaudRate(UART_device eUartDevice)
127         UINT16 ushBaudrate = 0; 
128         UINT16 ushTemp = 0;
129         
130         // Enable the Divisor lathc bit in LCR for accessing special register(DLL,DLH)
131         i2cUartWrite (eUartDevice, LCR, 0x80);
132         
133         // Read the baudrate 
134         ushBaudrate = i2cUartRead(eUartDevice, DLL);
135         ushTemp = i2cUartRead(eUartDevice, DLM);
136         ushBaudrate = (ushBaudrate & 0xFF) | ((ushTemp & 0xFF) << 8); 
138         // 8-bits
139         i2cUartWrite (eUartDevice, LCR, 0x03);
140         
141         return ushBaudrate;
144 /******************************************************************************
145  * 
146  * Function:    i2cUartRead  
147  *
148  * Description: This function reads a byte of data from I2C UART device  
149  * 
150  * Parameters:  UART_device eUartDevice - Uart Device   
151  *                              UINT8 uchAddress - Address of 8-bit register
152  *
153  * Return Value: UINT8 - 8-bit value read from the register
154  ******************************************************************************/
155 UINT8 i2cUartRead(UART_device eUartDevice, UINT8 uchAddress)
157         UINT8 uChAdd;
158         UINT8 uRcvChar = 0;
159         
160         if(I2C_UART_A == eUartDevice)
161                 uChAdd = (uchAddress | UARTA_SELECT);
162         else
163                 uChAdd = (uchAddress | UARTB_SELECT);
165         uRcvChar = i2cReadByte(uChAdd, I2C_UART_ADDR);
166         
167         return uRcvChar;
170 /******************************************************************************
171  * 
172  * Function:    i2cUartWrite  
173  *
174  * Description: This function writes a byte of data to I2C UART device  
175  * 
176  * Parameters:  UART_device eUartDevice - Uart Device   
177  *                              UINT8 uchAddress - Address of 8-bit register
178  *                              UINT8 uchByte   -  8-bit data to write
179  *
180  * Return Value: UINT8 - 8-bit value read from the register
181  ******************************************************************************/
182 void i2cUartWrite(UART_device eUartDevice, UINT8 uchAddress, 
183                                           UINT8 uchByte)
185         UINT8 uChAdd;
186         
187         if(I2C_UART_A == eUartDevice)
188                 uChAdd = (uchAddress | UARTA_SELECT);
189         else
190                 uChAdd = (uchAddress | UARTB_SELECT);
191         
192         i2cWriteByte(uChAdd, uchByte, I2C_UART_ADDR);
195 /******************************************************************************
196  * 
197  * Function:    i2cUartLedSet  
198  *
199  * Description: This function Sets ON a user LED. 
200  *
201  * Parameters:  UINT32 uiLedNum - Led number (0-7)
202  *
203  * Return Value: void
204  * 
205  ******************************************************************************/
206 void i2cUartLedSet(UINT32 uiLedNum)
208         UINT8 uchTemp = 0;
209         uchTemp = i2cUartRead(I2C_UART_A, IOSTATE);
210         uchTemp &= ~( 1 << (uiLedNum & 0x07) );
211         i2cUartWrite (I2C_UART_A, IOSTATE, uchTemp);
214 /******************************************************************************
215  * 
216  * Function:    i2cUartLedClear  
217  *
218  * Description: This function clears OFF a user LED. 
219  *
220  * Parameters:  UINT32 uiLedNum - Led number (0-7)
221  *
222  * Return Value: void
223  * 
224  ******************************************************************************/
225 void i2cUartLedClear(UINT32 uiLedNum)
227         UINT8 uchTemp = 0;
228         uchTemp = i2cUartRead(I2C_UART_A, IOSTATE);
229         uchTemp |= (1 << (uiLedNum & 0x07));
230         i2cUartWrite (I2C_UART_A, IOSTATE, uchTemp);