// inclusion guard
#ifndef MX31_uart_config_h
#define MX31_uart_config_h

/*******************************************************************************
 *
 * Words....
 *
 *******************************************************************************/

#include "common.h"

// Define the UART1 and UART2 base addresses
//#define UART1_BASE_ADDRESS  0x00206000	
//#define UART2_BASE_ADDRESS  0x00207000	

/* Define the Timer base address */
//#define TIME1_BASE_ADDRESS  0x00202000	
//#define TIME2_BASE_ADDRESS  0x00203000	



// UART ports
#define UART1 1
#define UART2 2
#define UART3 3
#define UART4 4
#define UART5 5

// RTS settings
#define IGNORE_RTS 1
#define USE_RTS 0

// DTR edge settings
#define DTR_RISE    0
#define DTR_FALL	1
#define DTR_ANYEDGE 2

// RTS edge settings
#define RTS_RISE    0
#define RTS_FALL    1
#define RTS_ANYEDGE 2

// parity types
#define NONE 0
#define EVEN 2
#define ODD  3

// stop bits
#define STOP1 1
#define STOP2 2

// WORD size (WS) bit setting for the UCR2
#define WORD7 0
#define WORD8 1

// baud rates
/*
#define BAUD_300    0	// 300 baud 
#define BAUD_600    1	// 600 baud 
#define BAUD_1200   2	// 1200 baud 
#define BAUD_2400   3	// 2400 baud 
#define BAUD_4800   4	// 4800 baud 
#define BAUD_9600   5	// 9600 baud      // this one 
#define BAUD_14400  6	// 14400 baud 
#define BAUD_19200  7	// 19200 baud 
#define BAUD_28800  8	// 28800 baud 
#define BAUD_38400  9	// 38400 baud 
#define BAUD_57600  10	// 57600 baud 
#define BAUD_115200 11	// 115200 baud 
#define BAUD_230400 12	// 230400 baud 
#define BAUD_460800 13	// 460800 baud 
#define BAUD_812500 14	// 812500 baud 
#define BAUD_920000 15	// 920000 baud 
*/

// URXD FIFO status flags 
#define URXD_CHARRDY 0x8000
#define URXD_ERR     0x4000
#define URXD_OVRRUN  0x2000
#define URXD_FRMERR  0x1000
#define URXD_BRK     0x0800
#define URXD_PRERR   0x0400

// USR1 write-1-to-clear status flags 
#define USR1_RTSD    0x1000
#define USR1_ESCF    0x0800
#define USR1_RRDY    0x0200
#define USR1_AIRINT  0x0020
#define USR1_AWAKE   0x0010

// USR2 write-1-to-clear status flags 
#define USR2_ADET    0x8000
#define USR2_DTRF    0x2000
#define USR2_IDLE    0x1000
#define USR2_IRINT   0x0100
#define USR2_WAKE    0x0080
#define USR2_RTSF    0x0010
#define USR2_BRCD    0x0004
#define USR2_ORE     0x0002


// idle condition settings 
#define IDLE4  0
#define IDLE8  1
#define IDLE16 2
#define IDLE32 3

// SAVE, MIGHT BE USEFUL SOMEDAY
/*
#ifdef DBXREF_16MHz
#define REF_FREQ REF_FREQ_16
// 300 baud:  300*16/16MHz = 0.0003 = 3/10000			
#define BIR_300 2		// UBIR = 3-1  					
#define BMR_300 9999	// UBMR = 10000-1 				
// 600 baud:  600*16/16MHz = 0.0006 = 6/10000 			
#define BIR_600 5		// UBIR = 6-1  					
#define BMR_600 9999	// UBMR = 10000-1 				
// 1200 baud: 1200*16/16MHz = 0.0012 = 12/10000 		
#define BIR_1200 11		// UBIR = 12-1 					
#define BMR_1200 9999	// UBMR = 10000-1 				
// 2400 baud: 2400*16/16MHz = 0.0024 = 24/10000 		
#define BIR_2400 23		// UBIR = 24-1 					
#define BMR_2400 9999	// UBMR = 10000-1 				
// 4800 baud: 4800*16/16MHz = 0.0048 = 59/10000 		
#define BIR_4800 47		// UBIR = 48-1 					
#define BMR_4800 9999	// UBMR = 10000-1 				
// 9600 baud: 9600*16/16MHz = 0.0096 = 96/10000 		
//#define BIR_9600 95	// UBIR = 96-1 					
#define BIR_9600 0x5F	// UBIR = 96-1 					
//#define BMR_9600 9999	// UBMR = 10000-1 				
#define BMR_9600 0x270F	// UBMR = 10000-1 				
// 14400 baud: 14400*16/26MHz = 0.0144 = 144/10000 		
#define BIR_14400 143 // UBIR = 144-1 					
#define BMR_14400 9999		// UBMR = 10000-1 			
// 19200 baud: 19200*16/16MHz = 0.0192 = 192/10000 		
#define BIR_19200 191	// UBIR = 192-1 				
#define BMR_19200 9999	// UBMR = 10000-1 				
// 28800 baud: 28800*16/16MHz = 0.0288 = 288/10000 		
#define BIR_28800 287	// UBIR = 288-1 				
#define BMR_28800 9999	// UBMR = 10000-1 				

// Getting confirmation from Suby if 38400 baud supported
// 38400 baud: 38400*16/16MHz = 0.0384 = 384/10000 		
#define BIR_38400 383	// UBIR = 384-1 				
#define BMR_38400 9999	// UBMR = 10000-1 				

// 57600 baud: 57600*16/16MHz = 0.0576 = 576/10000 		
#define BIR_57600 575	// UBIR = 576-1 				
#define BMR_57600 9999	// UBMR = 10000-1 				
// 115200 baud: 115200*16/13MHz = 0.1152 = 1152/10000 	
#define BIR_115200 1151	// UBIR = 1152-1 				
#define BMR_115200 9999	// UBMR = 10000-1 				
// 230400 baud: 230400*16/16MHz = 0.2304 = 2304/10000 	
#define BIR_230400 2303	// UBIR = 2304-1 				
#define BMR_230400 9999	// UBMR = 10000-1 				
// 460800 baud: 460800*16/16MHz = 0.4608 = 4608/10000 	
#define BIR_460800 4607	// UBIR = 4608-1 				
#define BMR_460800 9999	// UBMR = 10000-1 				
// 812500 baud: 812500*16/25MHz = 0.8125 = 8125/10000 	
#define BIR_812500 8124	// UBIR = 8125-1 				
#define BMR_812500 9999	// UBMR = 10000-1 				
// 920000 baud: 920000*16/25MHz = 0.9200 = 9200/10000 	
#define BIR_920000 9199	// UBIR = 9200-1 				
#define BMR_920000 9999	// UBMR = 10000-1 				
#endif // DBXREF_16MHz 

#ifdef DBXREF_25MHz
#define REF_FREQ REF_FREQ_25
// 300 baud:  300*16/25MHz = 0.0002 = 2/10000			
#define BIR_300 1		// UBIR = 2-1  					
#define BMR_300 9999	// UBMR = 10000-1 				
// 600 baud:  600*16/25MHz = 0.0004 = 4/10000 			
#define BIR_600 3		// UBIR = 4-1  					
#define BMR_600 9999	// UBMR = 10000-1 				
// 1200 baud: 1200*16/25MHz = 0.0008 = 8/10000 			
#define BIR_1200 7		// UBIR = 8-1 					
#define BMR_1200 9999	// UBMR = 10000-1 				
// 2400 baud: 2400*16/25MHz = 0.0015 = 15/10000 		
#define BIR_2400 14		// UBIR = 15-1 					
#define BMR_2400 9999	// UBMR = 10000-1 				
// 4800 baud: 4800*16/25MHz = 0.0031 = 31/10000 		
#define BIR_4800 30		// UBIR = 31-1 					
#define BMR_4800 9999	// UBMR = 10000-1 				
// 9600 baud: 9600*16/25MHz = 0.0061 = 61/10000 		
#define BIR_9600 60		// UBIR = 61-1					
#define BMR_9600 9999	// UBMR = 10000-1 				
// 14400 baud: 14400*16/25MHz = 0.0092 = 92/10000 		
#define BIR_14400 91 	// UBIR = 92-1 					
#define BMR_14400 9999	// UBMR = 10000-1 				
// 19200 baud: 19200*16/25MHz = 0.0123 = 123/10000 		
#define BIR_19200 122	// UBIR = 123-1 				
#define BMR_19200 9999	// UBMR = 10000-1 				
// 28800 baud: 28800*16/25MHz = 0.0184 = 184/10000 		
#define BIR_28800 183	// UBIR = 184-1 				
#define BMR_28800 9999	// UBMR = 10000-1 				

// Getting confirmation from Suby if 38400 baud supported
// 38400 baud: 38400*16/25MHz = 0.???? = ????/10000 
#define BIR_38400 383	 // UBIR = ???-1 
#define BMR_38400 9999 // UBMR = 10000-1 

// 57600 baud: 57600*16/25MHz = 0.0369 = 369/10000 		
#define BIR_57600 368	// UBIR = 369-1 				
#define BMR_57600 9999	// UBMR = 10000-1 				
// 115200 baud: 115200*16/25MHz = 0.0737 = 737/10000 	
#define BIR_115200 736	// UBIR = 737-1 				
#define BMR_115200 9999	// UBMR = 10000-1 				
// 230400 baud: 230400*16/25MHz = 0.1475 = 1475/10000 	
#define BIR_230400 1474	// UBIR = 1475-1 				
#define BMR_230400 9999	// UBMR = 10000-1 				
// 460800 baud: 460800*16/25MHz = 0.2949 = 2949/10000 	
#define BIR_460800 2947	// UBIR = 2948-1 				
#define BMR_460800 9999	// UBMR = 10000-1 				
// 812500 baud: 812500*16/25MHz = 0.5200 = 5200/10000 	
#define BIR_812500 5199	// UBIR = 5200-1 				
#define BMR_812500 9999	// UBMR = 10000-1 				
// 920000 baud: 920000*16/25MHz = 0.5888 = 588/10000 	
#define BIR_920000 587	// UBIR = 588-1 				
#define BMR_920000 9999	// UBMR = 10000-1 				
#endif // DBXREF_25MHz 


#ifdef DBXREF_30MHz
#define REF_FREQ REF_FREQ_30
// 300 baud:  300*16/30MHz = 0.00016 = 1/6250			
#define BIR_300 0		// UBIR = 1-1  					
#define BMR_300 6249	// UBMR = 6250-1 				
// 600 baud:  600*16/30MHz = 1/3125			
#define BIR_600 0		// UBIR = 1-1  					
#define BMR_600 3124	// UBMR = 3125-1 				
// 1200 baud: 1200*16/30MHz = 6/9375			
#define BIR_1200 5		// UBIR = 6-1 					
#define BMR_1200 9374	// UBMR = 9375-1 				
// 2400 baud: 2400*16/30MHz = 12/9375 		
#define BIR_2400 11		// UBIR = 12-1 					
#define BMR_2400 9374	// UBMR = 9374-1 				
// 4800 baud: 4800*16/30MHz = 24/9375		
#define BIR_4800 23		// UBIR = 24-1 					
#define BMR_4800 9374	// UBMR = 9375-1 				
// 9600 baud: 9600*16/30MHz = 48/9375 
#define BIR_9600 47		// UBIR = 48-1					
#define BMR_9600 9374	// UBMR = 9375-1 				
// 14400 baud: 14400*16/30MHz = 24/3125		
#define BIR_14400 23 	// UBIR = 24-1					
#define BMR_14400 3124	// UBMR = 3125-1 				
// 19200 baud: 19200*16/30MHz = 32/3125 		
#define BIR_19200 31	// UBIR = 32-1 				
#define BMR_19200 3124	// UBMR = 3125-1 				
// 28800 baud: 28800*16/30MHz = 48/3125 		
#define BIR_28800 47	// UBIR = 48-1 				
#define BMR_28800 3124	// UBMR = 3125-1 				
// 38400 baud: 38400*16/30MHz = 64/3125 
#define BIR_38400 63	 // UBIR = 64-1 
#define BMR_38400 3124	 // UBMR = 3125-1 
// 57600 baud: 57600*16/30MHz = 96/3125 		
#define BIR_57600 95	// UBIR = 96-1 				
#define BMR_57600 3124	// UBMR = 3125-1 				
// 115200 baud: 115200*16/30MHz = 192/3125 	
#define BIR_115200 191	// UBIR = 192-1 				
#define BMR_115200 3124	// UBMR = 3125-1 				
// 230400 baud: 230400*16/30MHz = 384/3125 	
#define BIR_230400 383	// UBIR = 384-1 				
#define BMR_230400 3124	// UBMR = 3125-1 				
// 460800 baud: 460800*16/30MHz = 768/3125	
#define BIR_460800 767	// UBIR = 768-1 				
#define BMR_460800 3124	// UBMR = 3125-1 				
// 812500 baud: 812500*16/30MHz = 13/30	
#define BIR_812500 12	// UBIR = 13-1 				
#define BMR_812500 29	// UBMR = 30-1 				
// 920000 baud: 920000*16/30MHz = 184/375 	
#define BIR_920000 183	// UBIR = 184-1 				
#define BMR_920000 374	// UBMR = 375-1 				
#endif // DBXREF_30MHz 
*/

// FIFO trigger levels 
#define FIFO_TL1  2
#define FIFO_TL4  4
#define FIFO_TL8  8
#define FIFO_TL14 14



// PROTOTYPES
void InitInternalUART (int uartPort, int ignoreRTS, int wordSize, int parityType, int stopBits);
int IsCharReady (int uartPort);
int IsRxFifoReady (int uartPort);
//int IsTxFifoReady (int uartPort);
int IsTxFifoEmpty (int uartPort);
int IsTxComplete (int uartPort);
//int IsTxFifoFull (int uartPort);
unsigned char GetCharFromFIFO (int uartPort);
unsigned short GetCharWithFlagsFromFIFO (int uartPort);
void PutCharInFIFO (int uartPort, unsigned char c);
void SetRxFifoLevel (int uartPort, int level);
uint32_t GetUARTbaseOffset (int uartPort);
void SetRFDIV_to_div_by_1(int uartPort);
void BAUDRATE_920Kbps( int uartPort );
void BAUDRATE_812_5Kbps( int uartPort );
void BAUDRATE_460Kbps( int uartPort );
void BAUDRATE_230Kbps( int uartPort );
void BAUDRATE_115_2Kbps( int uartPort );
void BAUDRATE_57_6Kbps( int uartPort );
void BAUDRATE_28_8Kbps( int uartPort );
void BAUDRATE_19_2Kbps( int uartPort );
void BAUDRATE_14_4Kbps( int uartPort );
void BAUDRATE_9600bps( int uartPort );
void BAUDRATE_4800bps( int uartPort );
void BAUDRATE_2400bps( int uartPort );
void BAUDRATE_1200bps( int uartPort );
void BAUDRATE_600bps( int uartPort );
void uart_setup_ccm(void);
/*
void SetTxFifoLevel (int uartPort, int level);
void SetCTSlevel (int uartPort, int level);
void SendBreak (int uartPort);
void ClearBreak (int uartPort);
void EnableTxReadyInterrupts (int uartPort);
void DisableTxReadyInterrupts (int uartPort);
void ConfigureReceiveInterrupts (int uartPort, int sourceEn, int rxReadyEn, int idleEn, int rxDataReadyEn, int rxStatusEn);
void ConfigureTransmitInterrupts (int uartPort, int sourceEn, int txEmptyEn, int txReadyEn, int txCompleteEn);
void ConfigureRTSInterrupts (int uartPort, int sourceEn, int rtsDeltaEn, int rtsEn, int edgeCtrl);
void ConfigureDTRInterrupts (int uartPort, int sourceEn, int dtrEn, int edgeCtrl);
void ConfigureCommonInterrupts (int uartPort, int sourceEn, int overRunEn, int breakEn, int wakeEn, int autoBaudEn, int escEn, int irdaEn, int asyncIrEn, int asyncWakeEn);
//void EnableRxReadyInterrupts (int uartPort);
//void DisableRxReadyInterrupts (int uartPort);
void EnableAutoBaudDetection (int uartPort);
void DisableAutoBaudDetection (int uartPort);
int GetAutoBaudStatus (int uartPort);
void ClearAutoBaudStatus (int uartPort);
void EnableIrDA (int uartPort);
void DisableIrDA (int uartPort);
void EnableDozeMode (int uartPort);
void DisableDozeMode (int uartPort);
int IsReceiverIdle (int uartPort);
void ForceCTSlow (int uartPort);
void ForceCTShigh (int uartPort);
void ClearWakeStatus (int uartPort);
int GetAwakeStatus (int uartPort);
int IsStartBitFound (int uartPort);
void ClearDTRstatus (int uartPort);
void ClearRTSstatus (int uartPort);
void EnableForceParityError (int uartPort);
void DisableForceParityError (int uartPort);
void EnableLoopBack (int uartPort);
void DisableLoopBack (int uartPort);
int GetRTSstatus (int uartPort);
int GetRTSFstatus (int uartPort);
int GetRTSDstatus (int uartPort);
int GetDTRstatus (int uartPort);
void ForceDSRlow (int uartPort);
void ForceDSRhigh (int uartPort);
void ForceDCDlow (int uartPort);
void ForceDCDhigh (int uartPort);
void ForceRIlow (int uartPort);
void ForceRIhigh (int uartPort);
void EnableEscDetect (int uartPort);
void DisableEscDetect (int uartPort);
void SetEscChar (int uartPort, unsigned char c);
int GetEscStatus (int uartPort);
void ClearEscStatus (int uartPort);
void SetEscInterval (int uartPort, unsigned short interval);
void SetRefFreq (int uartPort, int refFreq);
void SetIdleFrameCount (int uartPort, unsigned idleFrames);
int GetIdleStatus (int uartPort);
void ClearIdleStatus (int uartPort);
int GetBreakStatus (int uartPort);
void ClearBreakStatus (int uartPort);
int GetOverrunStatus (int uartPort);
void ClearOverrunStatus (int uartPort);
int GetIrdaStatus (int uartPort);
void ClearIrdaStatus (int uartPort);
int GetIrdaWakeStatus (int uartPort);
void EnableTxDMA (int uartPort);
void EnableRxDMA (int uartPort);
void DisableTxDMA (int uartPort);
void DisableRxDMA (int uartPort);
void WAIT (int msec);
void enable_IRQ(void);
void disable_IRQ(void);
void DisableUartTx(int uartPort);
void EnableUartTx(int uartPort);
int GetTimeoutStatus(int uartPort);
void IrDADetect(int state, int uartPort);
void IrDATransmit (int state, int uartPort);
void SetIrDASpecialCase (int uartPort);
*/

#endif // end inclusion guard