/* ============================================================================
* Copyright (c) Texas Instruments Inc 2002, 2003, 2004, 2005, 2008
*
* Use of this software is controlled by the terms and conditions found in the
* license agreement under which this software has been supplied.
* ============================================================================
*/
/** @file csl_uart_example.c
*
* @brief UART functional layer sample source file
*
* Path: \(CSLPATH)\example\uart
*/
/* ============================================================================
* Revision History
* ================
* 16-Sep-2008 Created
* ============================================================================
*/
#include "csl_uart.h"
#include "csl_uartAux.h"
#include <csl_dma.h>
#include <stdio.h>
/*---------Global constants---------*/
/* String length to be received and transmitted */
#define WR_STR_LEN 80
#define RD_STR_LEN 10
#define CSL_TEST_FAILED (-1)
/*---------Global data definition---------*/
/* UART setup structure */
CSL_UartSetup mySetup =
{
/* Input clock freq in MHz */
60000000,
/* baud rate */
2400,
/* word length of 8 */
CSL_UART_WORD8,
/* To generate 1 stop bit */
0,
/* Disable the parity */
CSL_UART_DISABLE_PARITY,
/*disable fifo */
// CSL_UART_FIFO_DISABLE,
/*enable trigger 14 fifo */
CSL_UART_FIFO_DMA1_ENABLE_TRIG14,
/* Loop Back enable */
CSL_UART_NO_LOOPBACK,
/**No auto flow control*/
CSL_UART_NO_AFE ,
/** No RTS */
CSL_UART_NO_RTS ,
};
CSL_UartObj uartObj;
CSL_DMA_Handle dmaWrHandle;
CSL_DMA_Handle dmaRdHandle;
CSL_DMA_Config dmaConfig;
CSL_DMA_ChannelObj dmaWrChanObj;
CSL_DMA_ChannelObj dmaRdChanObj;
#define NO_OF_CHAR_TO_READ 30
#define NO_OF_CHAR_TO_WRITE 28
#define CSL_UART_WRBUF_SIZE (NO_OF_CHAR_TO_WRITE*4)
#define CSL_UART_RDBUF_SIZE (NO_OF_CHAR_TO_READ*4)
/**Dma write is happening in 32 bits,if use character array*/
Uint32 guartDmaWriteBuf[CSL_UART_WRBUF_SIZE] = {'\n','\n','\r','E','N','T','E','R',' ','T','E','X','T',' ','O','F',' ','L','E','N','G','T','H',' ','3','0','\n','\r'};
char guartDmaReadBuf[CSL_UART_RDBUF_SIZE];
/**
* \brief Configures Dma
*
* \param chanNum - Dma channel number
*
* \return Dma handle
*/
CSL_DMA_Handle CSL_configDmaForUart(CSL_DMA_ChannelObj *dmaChanObj,
CSL_DMAChanNum chanNum)
{
CSL_DMA_Handle dmaHandle;
CSL_Status status;
dmaHandle = NULL;
/* Initialize Dma */
status = DMA_init();
if (status != CSL_SOK)
{
printf("DMA_init Failed!\n");
}
/* Open A Dma channel */
dmaHandle = DMA_open(chanNum, dmaChanObj, &status);
//dmaHandle = DMA_open(chanNum, &status);
if(dmaHandle == NULL)
{
printf("DMA_open Failed!\n");
}
/* Configure a Dma channel */
status = DMA_config(dmaHandle, &dmaConfig);
if(status != CSL_SOK)
{
printf("DMA_config Failed!\n");
dmaHandle = NULL;
}
return(dmaHandle);
}
int main()
{
CSL_UartHandle hUart;
CSL_Status status;
int looper = 0;
/* Loop counter and error flag */
status = UART_init(&uartObj,CSL_UART_INST_0,UART_POLLED);
if(CSL_SOK != status)
{
printf("UART_init failed error code %d\n",status);
return status;
}
/** Handle created*/
hUart = (CSL_UartHandle)(&uartObj);
/* Configure DMA channel for nand write */
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBURST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_UART_TX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_WRITE;
dmaConfig.trfType = CSL_DMA_TRANSFER_IO_MEMORY;
dmaConfig.dataLen = CSL_UART_WRBUF_SIZE;
dmaConfig.srcAddr = (Uint32)guartDmaWriteBuf;
dmaConfig.destAddr = (Uint32)&(hUart->uartRegs->THR);
dmaWrHandle = CSL_configDmaForUart(&dmaWrChanObj, CSL_DMA_CHAN4);
if(dmaWrHandle == NULL)
{
printf("DMA Config for Uart Write Failed!\n!");
return(CSL_TEST_FAILED);
}
/* Configure UART registers using setup structure */
status = UART_setup(hUart,&mySetup);
if(CSL_SOK != status)
{
printf("UART_setup failed error code %d\n",status);
return status;
}
/* Start Dma transfer */
status = DMA_start(dmaWrHandle);
if(status != CSL_SOK)
{
printf("Uart Dma Write Failed!!\n");
return(status);
}
/* Check transfer complete status */
while(DMA_getStatus(dmaWrHandle));
/* Configure DMA channel for nand read */
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBURST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_UART_RX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_READ;
dmaConfig.trfType = CSL_DMA_TRANSFER_IO_MEMORY;
dmaConfig.dataLen = CSL_UART_RDBUF_SIZE;
dmaConfig.srcAddr = (Uint32)&(hUart->uartRegs->THR);
dmaConfig.destAddr = (Uint32)guartDmaReadBuf;
dmaRdHandle = CSL_configDmaForUart(&dmaRdChanObj,CSL_DMA_CHAN4);
if(dmaRdHandle == NULL)
{
printf("DMA Config for DMA Read Failed!\n!");
return(CSL_TEST_FAILED);
}
/* Start Dma transfer */
status = DMA_start(dmaRdHandle);
if(status != CSL_SOK)
{
printf("Uart Dma Write Failed!!\n");
return(status);
}
/* Check transfer complete status */
while(DMA_getStatus(dmaRdHandle));
for(looper = 1; looper < (NO_OF_CHAR_TO_READ*2); looper+=2)
printf("%c",guartDmaReadBuf[looper]);
printf("\n");
return 0;
}