Refix c64x: uart API and null_uart
[keystone-rtos/ibl.git] / src / hw / uart / c66x_uart / evmc66x_uart.c
old mode 100644 (file)
new mode 100755 (executable)
index 7d319bb..1f0472e
 /******************************************************************************
  * Copyright (c) 2011 Texas Instruments Incorporated - http://www.ti.com
- * 
- *  Redistribution and use in source and binary forms, with or without 
- *  modification, are permitted provided that the following conditions 
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
  *  are met:
  *
- *    Redistributions of source code must retain the above copyright 
+ *    Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  *
  *    Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the 
- *    documentation and/or other materials provided with the   
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the
  *    distribution.
  *
  *    Neither the name of Texas Instruments Incorporated nor the names of
  *    its contributors may be used to endorse or promote products derived
  *    from this software without specific prior written permission.
  *
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * 
+ *
  *****************************************************************************/
 
-#include "platform_internal.h"
+#include "evmc66x_uart.h"
 
-#if (PLATFORM_UART_IN)
+static void uart_delay_cycles(uint32_t cycles)
+{
+    while (cycles--) {
+        asm ("NOP");
+    }
+}
 
 /******************************************************************************
  *
- * File Name:          evmc66x_uart.c
- *
- * Description:        This file contains APIs for  UART. 
- * 
- * 
- ******************************************************************************/
-
-/************************
- * Include Files
- ************************/
-
-/******************************************************************************
- * 
- * Function:   UartInit  
+ * Function:    uart_init
  *
- * Description:        This function initializes the UART. 
+ * Description: This function initializes UART peripheral for C66x
  *
- * Parameters: void
+ * Parameters: str    - string to print
+ *             length - length of the string to print
  *
- * Return Value: void
- * 
+ * Return Value: none
  ******************************************************************************/
-void UartInit(void)
+void uart_init(void)
 {
-    //      Allows access to the divisor latches of the baud generator during a 
-    // read or write operation (DLL and DLH)
-    CSL_FINS (hUartRegs->LCR, UART_LCR_DLAB, CSL_UART_LCR_DLAB_ENABLE);
-    //      Break condition is disabled.
-    CSL_FINS (hUartRegs->LCR, UART_LCR_BC,   CSL_UART_LCR_BC_DISABLE);
-    //      Stick parity is disabled.
-    CSL_FINS (hUartRegs->LCR, UART_LCR_SP,   CSL_UART_LCR_SP_DISABLE);
-    //      Odd parity is selected
-    CSL_FINS (hUartRegs->LCR, UART_LCR_EPS,  CSL_UART_LCR_EPS_ODD);
-    //      No PARITY bit is transmitted or checked
-    CSL_FINS (hUartRegs->LCR, UART_LCR_PEN,  CSL_UART_LCR_PEN_DISABLE);    
-
-    // Set the baudrate,for accessing LCR[7] should be enable 
-    hUartRegs->DLL  = DLL_VAL;
-    hUartRegs->DLH  = DLM_VAL;
+    uint8_t DLL_val = 0;
+    uint8_t DLH_val = 0;
+
+    /* Setting baud rate to 115200 */
+    DLL_val = (uint8_t )(0x00FF & BAUD_RATE_115200);
+    DLH_val = (uint8_t )(0x00FF & (BAUD_RATE_115200  >> 8));
+
+    /* Allows access to the divisor latches of the baud generator during a
+       read or write operation (DLL and DLH) */
+
+    uart_registers->LCR = 0x80;
+
+    /* Set the baudrate,for accessing LCR[7] should be enable */
+    uart_registers->DLL  = DLL_val;
+    uart_registers->DLH  = DLH_val;
+
+    /* Allows access to the receiver buffer register (RBR),
+       the transmitter holding register (THR), and the
+       interrupt enable register (IER) selected. */
+    uart_registers->LCR = 0x18;
+
+    /* Disable THR, RHR, Receiver line status interrupts */
+    uart_registers->IER = 0;
+
+    /* If autoflow control is desired,
+     * write appropriate values to the modem
+     * control register (MCR). Note that all UARTs
+     * do not support autoflow control, see
+     * the device-specific data manual for supported features.
+     *
+     * MCR
+     * ====================================================
+     * Bit  Field   Value   Description
+     * 5    AFE     0       Autoflow control is disabled
+     * 4    LOOP    0       Loop back mode is disabled.
+     * 1    RTS     0       RTS control (UARTn_RTS is disabled,
+     *                      UARTn_CTS is only enabled.)
+     * =====================================================
+     *
+     *
+     */
+
+    uart_registers->MCR = 0;
+
+    /* Choose the desired response to
+     * emulation suspend events by configuring
+     * the FREE bit and enable the UART by setting
+     * the UTRST and URRST bits in the power and
+     * emulation management register (PWREMU_MGMT).
+     *
+     *
+     * PWREMU_MGMT
+     * =================================================
+     * Bit  Field   Value   Description
+     * 14   UTRST   1       Transmitter is enabled
+     * 13   URRST   1       Receiver is enabled
+     * 0    FREE    1       Free-running mode is enabled
+     * ===================================================
+     *
+     */
+    uart_registers->PWREMU_MGMT = 0x6001;
 
-    // Allows access to the receiver buffer register (RBR), 
-    // the transmitter holding register (THR), and the
-    // interrupt enable register (IER) selected.
-    CSL_FINS (hUartRegs->LCR, UART_LCR_DLAB, CSL_UART_LCR_DLAB_DISABLE);
-    // Even Parity is selected
-    CSL_FINS (hUartRegs->LCR, UART_LCR_EPS, CSL_UART_LCR_EPS_EVEN);
-    // Parity Enable 
-    CSL_FINS (hUartRegs->LCR, UART_LCR_PEN, CSL_UART_LCR_PEN_ENABLE);
-    // Disable THR, RHR, Receiver line status interrupts
-    CSL_FINS (hUartRegs->IER, UART_IER_ERBI,  CSL_UART_IER_ERBI_DISABLE);
-    CSL_FINS (hUartRegs->IER, UART_IER_ETBEI, CSL_UART_IER_ETBEI_DISABLE);
-    CSL_FINS (hUartRegs->IER, UART_IER_ELSI,  CSL_UART_IER_ELSI_DISABLE);
-    CSL_FINS (hUartRegs->IER, UART_IER_EDSSI, CSL_UART_IER_EDSSI_DISABLE);  
-
-    /* If autoflow control is desired, 
-    * write appropriate values to the modem 
-    * control register (MCR). Note that all UARTs 
-    * do not support autoflow control, see 
-    * the device-specific data manual for supported features.
-    * 
-    * MCR
-    * ====================================================
-    * Bit  Field   Value   Description
-    * 5    AFE     0       Autoflow control is disabled
-    * 4    LOOP    0       Loop back mode is disabled.
-    * 1    RTS     0       RTS control (UARTn_RTS is disabled, 
-    *                      UARTn_CTS is only enabled.)
-    * =====================================================
-    * 
-    * 
-    */
-
-    hUartRegs->MCR = 0;
+    /* Cleanup previous data (rx trigger is also set to 0)*/
+    uart_registers->FCR = 0xC1;
 
-    /* Choose the desired response to 
-    * emulation suspend events by configuring 
-    * the FREE bit and enable the UART by setting 
-    * the UTRST and URRST bits in the power and 
-    * emulation management register (PWREMU_MGMT).
-    * 
-    * 
-    * PWREMU_MGMT
-    * =================================================
-    * Bit  Field   Value   Description
-    * 14   UTRST   1       Transmitter is enabled
-    * 13   URRST   1       Receiver is enabled
-    * 0    FREE    1       Free-running mode is enabled
-    * ===================================================
-    * 
-    */
-    hUartRegs->PWREMU_MGMT = 0x6001;
+    /* Setting the baud rate */
+    uart_registers->LCR = 0x80;
 
-    /* Cleanup previous data (rx trigger is also set to 0)*/
-    /* Set FCR = 0x07;        */
-    CSL_FINS (hUartRegs->FCR, UART_FCR_FIFOEN,   CSL_UART_FCR_FIFOEN_ENABLE);
-    CSL_FINS (hUartRegs->FCR, UART_FCR_TXCLR,    CSL_UART_FCR_TXCLR_CLR);
-    CSL_FINS (hUartRegs->FCR, UART_FCR_RXCLR,    CSL_UART_FCR_RXCLR_CLR);
-    CSL_FINS (hUartRegs->FCR, UART_FCR_DMAMODE1, CSL_UART_FCR_DMAMODE1_DISABLE);
-    CSL_FINS (hUartRegs->FCR, UART_FCR_RXFIFTL,  CSL_UART_FCR_RXFIFTL_CHAR1);
+    /* Set the baudrate,for accessing LCR[7] should be enable */
+    uart_registers->DLL  = DLL_val;
+    uart_registers->DLH  = DLH_val;
+    uart_registers->LCR  = 0x03;
 
     return;
 }
 
 /******************************************************************************
- * 
- * Function:   UartSetBaudRate  
  *
- * Description:        This function sets the UART baudrate. 
+ * Function:    uart_write_byte
  *
- * Parameters: UINT16 uiBaudRate - baudrate to set
+ * Description: This function writes a byte of data to UART device
  *
- * Return Value: void
- * 
- ******************************************************************************/
-void UartSetBaudRate(uint16_t uiBaudRate)
-{
-    uint8_t uiDLLVal = 0;
-    uint8_t uiDLHVal = 0;
-
-    hUartRegs->LCR = 0x80;
-    uiDLLVal = (uint8_t )(0x00FF & uiBaudRate);
-    uiDLHVal = (uint8_t )(0x00FF & (uiBaudRate  >> 8));
-
-    // Set the baudrate,for accessing LCR[7] should be enable 
-    hUartRegs->DLL  = uiDLLVal;
-    hUartRegs->DLH  = uiDLHVal;
-    hUartRegs->LCR = 0x03;
-}
-
-/******************************************************************************
- * 
- * Function:   UartReadBaudRate  
+ * Parameters:  byte    -  8-bit data to write to THR
  *
- * Description:        This function reads the UART baudrate. 
- *
- * Parameters: UART_device eUartDevice - Uart Device
- *
- * Return Value: UINT16 - 16 bit Baudrate read from UART
- * 
+ * Return Value: none
  ******************************************************************************/
-uint16_t UartReadBaudRate(void)
+static inline void uart_write_byte(uint8_t byte)
 {
-    uint16_t ushBaudrate = 0;
-    uint16_t ushTemp = 0;
-
-    hUartRegs->LCR = 0x80;
-    // Read the baudrate 
-    ushBaudrate = hUartRegs->DLL;
-    ushTemp     = hUartRegs->DLH;
-    ushBaudrate = (ushBaudrate & 0xFF) | ((ushTemp & 0xFF) << 8); 
-    hUartRegs->LCR = 0x03;
-    return ushBaudrate;
+    while (!(uart_registers->LSR & UART_LSR_THRE_MASK)) {
+        uart_delay_cycles(10000);
+    }
+    uart_registers->THR = (UART_THR_DATA_MASK & byte);
+    return;
 }
 
 /******************************************************************************
- * 
- * Function:   UartReadData  
  *
- * Description: This function reads a byte of data from I2C UART device  
- * 
- * Return Value: uint8_t - 8-bit value read from the RBR register
- ******************************************************************************/
-uint8_t UartReadData(void)
-{
-       uint8_t uRcvChar = 0;
-       
-       uRcvChar = CSL_FEXT(hUartRegs->RBR, UART_RBR_DATA);
-       
-       return uRcvChar;
-}
-
-/******************************************************************************
- * 
- * Function:   UartWriteData
+ * Function:    uart_write_string
  *
- * Description:        This function writes a byte of data to UART device  
- * 
- * Parameters: uint8_t uchAddress - Address of 8-bit register
- *                             uint8_t uchByte -  8-bit data to write to THR
+ * Description: This function writes a string of data to UART device
+ *
+ * Parameters: str    - string to print
+ *             length - length of the string to print, maximum is 80
  *
  * Return Value: none
  ******************************************************************************/
-void UartWriteData(uint8_t uchByte)
-
+void uart_write_string(char * str, uint32_t length)
 {
-    while (!(CSL_FEXT(hUartRegs->LSR, UART_LSR_THRE))) {
-               platform_delaycycles(10000);
+    uint32_t i;
+    if (length==0)
+    {
+       /*Maximum length is 80 */
+       length=80;
     }
-    CSL_FINS(hUartRegs->THR, UART_THR_DATA, uchByte);
-    return;
-}
-
-
-
-/******************************************************************************
- * 
- * Function:   UartIsDataReady
- *
- * Description:        This function gets the status of DR bit  
- * 
- * Parameters: none
- * 
- * Return Value: Status of DR bit
- *                             
- ******************************************************************************/
-Bool UartIsDataReady(void)
-{
-       Bool DR_val = FALSE;
-       
-       if (CSL_UART_LSR_DR_READY == (CSL_FEXT(hUartRegs->LSR, UART_LSR_DR))) {
-        DR_val  = TRUE;
+    for(i = 0; i < length; i++) {
+        if(str[i]=='\0') break;
+        uart_write_byte((uint8_t)str[i]);
     }
-       
-       return (DR_val);
+    uart_write_byte((uint8_t)0x0D);
+    uart_write_byte((uint8_t)0x0A);
 }
-/* Nothing past this point */
 
-#endif