embeddedsw/XilinxProcessorIPLib/drivers/uartns550/src/xuartns550.h
Kedareswara rao Appana 1ae85a7367 uart: Incorrect freq value being exported to the xparameters.h file
This patch fixes the issue incorrect freq value being exported to
the xparameters.h file when uart is configured with external clock.

Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
2014-11-25 21:38:16 +05:30

456 lines
18 KiB
C
Executable file

/******************************************************************************
*
* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
******************************************************************************/
/****************************************************************************/
/**
*
* @file xuartns550.h
*
* This driver supports the following features in the Xilinx 16450/16550
* compatible UART.
*
* - Dynamic data format (baud rate, data bits, stop bits, parity)
* - Polled mode
* - Interrupt driven mode
* - Transmit and receive FIFOs (16 bytes each for the 16550)
* - Access to the external modem control lines and the two discrete
* outputs
*
* The only difference between the 16450 and the 16550 is the addition of
* transmit and receive FIFOs in the 16550.
*
* <b>Initialization & Configuration</b>
*
* The XUartNs550_Config structure is used by the driver to configure itself.
* This configuration structure is typically created by the tool-chain based
* on HW build properties.
*
* To support multiple runtime loading and initialization strategies employed
* by various operating systems, the driver instance can be initialized in one
* of the following ways:
*
* - XUartNs550_Initialize(InstancePtr, DeviceId) - The driver looks
* up its own configuration structure created by the tool-chain based
* on an ID provided by the tool-chain.
*
* - XUartNs550_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a
* configuration structure provided by the caller. If running in a system
* with address translation, the provided virtual memory base address
* replaces the physical address present in the configuration structure.
*
* <b>Baud Rate</b>
*
* The UART has an internal baud rate generator that is clocked at a specified
* input clock frequency. Not all baud rates can be generated from some clock
* frequencies. The requested baud rate is checked using the provided clock for
* the system, and checked against the acceptable error range. An error may be
* returned from some functions indicating the baud rate was in error because
* it could not be generated.
*
* <b>Interrupts</b>
*
* The device does not have any way to disable the receiver such that the
* receive FIFO may contain unwanted data. The FIFOs are not flushed when the
* driver is initialized, but a function is provided to allow the user to reset
* the FIFOs if desired.
*
* The driver defaults to no interrupts at initialization such that interrupts
* must be enabled if desired. An interrupt is generated for any of the following
* conditions.
* - Transmit FIFO is empty
* - Data in the receive FIFO equal to the receive threshold
* - Data in the receiver when FIFOs are disabled
* - Any receive status error or break condition detected
* - Data in the receive FIFO for 4 character times without receiver
* activity
* - A change of a modem signal
*
* The application can control which interrupts are enabled using the SetOptions
* function.
*
* In order to use interrupts, it is necessary for the user to connect the driver
* interrupt handler, XUartNs550_InterruptHandler(), to the interrupt system of
* the application. This function does not save and restore the processor context
* such that the user must provide it. A handler must be set for the driver such
* that the handler is called when interrupt events occur. The handler is called
* from interrupt context and is designed to allow application specific
* processing to be performed.
*
* The functions, XUartNs550_Send() and XUartNs550_Recv(), are provided in the
* driver to allow data to be sent and received. They are designed to be used in
* polled or interrupt modes.
*
* @note
*
* The default configuration for the UART after initialization is:
* - 19,200 bps or XPAR_DEFAULT_BAUD_RATE if defined
* - 8 data bits
* - 1 stop bit
* - no parity
* - FIFO's are enabled with a receive threshold of 8 bytes
*
* <pre>
* MODIFICATION HISTORY:
*
* Ver Who Date Changes
* ----- ---- -------- -----------------------------------------------
* 1.00a ecm 08/16/01 First release
* 1.00b jhl 03/11/02 Repartitioned the driver for smaller files.
* 1.01a jvb 12/14/05 I separated dependency on the static config table and
* xparameters.h from the driver initialization by moving
* _Initialize and _LookupConfig to _sinit.c. I also added
* the new _CfgInitialize routine.
* 1.11a sv 03/20/07 Updated to use the new coding guidelines.
* 1.11a sv 07/25/08 Corrected the definitions of XUN_MODEM_DCD_DELTA_MASK
* and XUN_MODEM_DCD_MASK.
* 1.12a sdm 08/22/08 Removed support for static interrupt handlers from the MDD
* file
* 1.12a sdm 12/15/08 Deprecated the CLOCK_HZ parameter in mdd and updated the
* Tcl to obtain the bus frequency during libgen
* 1.13a sdm 07/10/09 a) Updated the driver Tcl to obtain the external clock
* frequency from MHS, when C_HAS_EXTERNAL_XIN = 1.
* b) Added receive line interrupt option to OptionsTable[]
* in xuartns550_options.c
* 2.00a ktn 10/20/09 Converted all register accesses to 32 bit access.
* Updated to use HAL Processor APIs. _m is removed from the
* name of all the macro definitions. XUartNs550_mClearStats
* macro is removed, XUartNs550_ClearStats function should be
* used in its place.
* 2.01a bss 01/13/12 Updated the XUartNs550_SelfTest to use Xil_AssertNonvoid
* in place of XASSERT_NONVOID for CR 641344.
* Removed unneccessary read of the LCR register in the
* XUartNs550_CfgInitialize function. Removed compiler
* warnings for unused variables in the
* XUartNs550_StubHandler.
* 2.02a adk 09/16/13 Fixed CR:735289 changes are made in the xuartns550_intr.c
* file.
* 3.0 adk 19/12/13 Updated as per the New Tcl API's
* 3.1 adk 20/08/14 Fixed CR:816989 Canonical Definition for Multiple
* Instances of UARTSNS550 have the same Device Id.
* Changes are made in the driver tcl file.
* 3.2 adk 15/10/14 Fixed CR:824444 changes are made in the example file
* xuartns550_intr_example.c.
* 3.2 adk 15/10/14 Fixed CR:826435 changes are made in the driver tcl file.
* </pre>
*
*****************************************************************************/
#ifndef XUARTNS550_H /* prevent circular inclusions */
#define XUARTNS550_H /* by using protection macros */
#ifdef __cplusplus
extern "C" {
#endif
/***************************** Include Files ********************************/
#include "xil_types.h"
#include "xil_assert.h"
#include "xstatus.h"
#include "xuartns550_l.h"
/************************** Constant Definitions ****************************/
/*
* The following constants indicate the max and min baud rates and these
* numbers are based only on the testing that has been done. The hardware
* is capable of other baud rates.
*/
#define XUN_NS16550_MAX_RATE 115200
#define XUN_NS16550_MIN_RATE 300
/** @name Configuration options
* @{
*/
/**
* These constants specify the options that may be set or retrieved
* with the driver, each is a unique bit mask such that multiple options
* may be specified. These constants indicate the function of the option
* when in the active state.
*/
#define XUN_OPTION_RXLINE_INTR 0x0800 /**< Enable status interrupt */
#define XUN_OPTION_SET_BREAK 0x0400 /**< Set a break condition */
#define XUN_OPTION_LOOPBACK 0x0200 /**< Enable local loopback */
#define XUN_OPTION_DATA_INTR 0x0100 /**< Enable data interrupts */
#define XUN_OPTION_MODEM_INTR 0x0080 /**< Enable modem interrupts */
#define XUN_OPTION_FIFOS_ENABLE 0x0040 /**< Enable FIFOs */
#define XUN_OPTION_RESET_TX_FIFO 0x0020 /**< Reset the transmit FIFO */
#define XUN_OPTION_RESET_RX_FIFO 0x0010 /**< Reset the receive FIFO */
#define XUN_OPTION_ASSERT_OUT2 0x0008 /**< Assert out2 signal */
#define XUN_OPTION_ASSERT_OUT1 0x0004 /**< Assert out1 signal */
#define XUN_OPTION_ASSERT_RTS 0x0002 /**< Assert RTS signal */
#define XUN_OPTION_ASSERT_DTR 0x0001 /**< Assert DTR signal */
/*@}*/
/** @name Data format values
* @{
*/
/**
* These constants specify the data format that may be set or retrieved
* with the driver. The data format includes the number of data bits, the
* number of stop bits and parity.
*
*/
#define XUN_FORMAT_8_BITS 3 /**< 8 data bits */
#define XUN_FORMAT_7_BITS 2 /**< 7 data bits */
#define XUN_FORMAT_6_BITS 1 /**< 6 data bits */
#define XUN_FORMAT_5_BITS 0 /**< 5 data bits */
#define XUN_FORMAT_EVEN_PARITY 2 /**< Even Parity */
#define XUN_FORMAT_ODD_PARITY 1 /**< Odd Parity */
#define XUN_FORMAT_NO_PARITY 0 /**< No Parity */
#define XUN_FORMAT_2_STOP_BIT 1 /**< 2 stop bits */
#define XUN_FORMAT_1_STOP_BIT 0 /**< 1 stop bit */
/*@}*/
/** @name FIFO trigger values
* @{
*/
/*
* These constants specify receive FIFO trigger levels which specify
* the number of bytes at which a receive data event (interrupt) will occur.
*
*/
#define XUN_FIFO_TRIGGER_14 0xC0 /**< 14 byte trigger level */
#define XUN_FIFO_TRIGGER_08 0x80 /**< 8 byte trigger level */
#define XUN_FIFO_TRIGGER_04 0x40 /**< 4 byte trigger level */
#define XUN_FIFO_TRIGGER_01 0x00 /**< 1 byte trigger level */
/*@}*/
/** @name Modem status values
* @{
*/
/**
* These constants specify the modem status that may be retrieved
* from the driver.
*
*/
#define XUN_MODEM_DCD_DELTA_MASK 0x08 /**< DCD signal changed state */
#define XUN_MODEM_DSR_DELTA_MASK 0x02 /**< DSR signal changed state */
#define XUN_MODEM_CTS_DELTA_MASK 0x01 /**< CTS signal changed state */
#define XUN_MODEM_RINGING_MASK 0x40 /**< Ring signal is active */
#define XUN_MODEM_DSR_MASK 0x20 /**< Current state of DSR signal */
#define XUN_MODEM_CTS_MASK 0x10 /**< Current state of CTS signal */
#define XUN_MODEM_DCD_MASK 0x80 /**< Current state of DCD signal */
#define XUN_MODEM_RING_STOP_MASK 0x04 /**< Ringing has stopped */
/*@}*/
/** @name Callback events
* @{
*/
/**
* These constants specify the handler events that are passed to
* a handler from the driver. These constants are not bit masks such that
* only one will be passed at a time to the handler.
*
*/
#define XUN_EVENT_RECV_DATA 1 /**< Data has been received */
#define XUN_EVENT_RECV_TIMEOUT 2 /**< A receive timeout occurred */
#define XUN_EVENT_SENT_DATA 3 /**< Data has been sent */
#define XUN_EVENT_RECV_ERROR 4 /**< A receive error was detected */
#define XUN_EVENT_MODEM 5 /**< A change in modem status */
/*@}*/
/** @name Error values
* @{
*/
/**
* These constants specify the errors that may be retrieved from
* the driver using the XUartNs550_GetLastErrors function. All of them are
* bit masks, except no error, such that multiple errors may be specified.
*
*/
#define XUN_ERROR_BREAK_MASK 0x10 /**< Break detected */
#define XUN_ERROR_FRAMING_MASK 0x08 /**< Receive framing error */
#define XUN_ERROR_PARITY_MASK 0x04 /**< Receive parity error */
#define XUN_ERROR_OVERRUN_MASK 0x02 /**< Receive overrun error */
#define XUN_ERROR_NONE 0x00 /**< No error */
/*@}*/
/**************************** Type Definitions ******************************/
/**
* This typedef contains configuration information for the device.
*/
typedef struct {
u16 DeviceId; /**< Unique ID of device */
u32 BaseAddress; /**< Base address of device */
u32 InputClockHz; /**< Input clock frequency */
u32 DefaultBaudRate; /**< Baud Rate in bps, ie 1200 */
} XUartNs550_Config;
/**
* The following data type is used to manage the buffers that are handled
* when sending and receiving data in the interrupt mode.
*/
typedef struct {
u8 *NextBytePtr;
unsigned int RequestedBytes;
unsigned int RemainingBytes;
} XUartNs550Buffer;
/**
* This data type allows the data format of the device to be set
* and retrieved.
*/
typedef struct {
u32 BaudRate; /**< In bps, ie 1200 */
u32 DataBits; /**< Number of data bits */
u32 Parity; /**< Parity */
u8 StopBits; /**< Number of stop bits */
} XUartNs550Format;
/*****************************************************************************/
/**
* This data type defines a handler which the application must define
* when using interrupt mode. The handler will be called from the driver in an
* interrupt context to handle application specific processing.
*
* @param CallBackRef is a callback reference passed in by the upper layer
* when setting the handler, and is passed back to the upper layer
* when the handler is called.
* @param Event contains one of the event constants indicating why the
* handler is being called.
* @param EventData contains the number of bytes sent or received at
* the time of the call for send and receive events and contains
* the modem status for modem events.
*
*****************************************************************************/
typedef void (*XUartNs550_Handler)(void *CallBackRef, u32 Event,
unsigned int EventData);
/**
* UART statistics
*/
typedef struct {
u16 TransmitInterrupts; /**< Number of transmit interrupts */
u16 ReceiveInterrupts; /**< Number of receive interrupts */
u16 StatusInterrupts; /**< Number of status interrupts */
u16 ModemInterrupts; /**< Number of modem interrupts */
u16 CharactersTransmitted; /**< Number of characters transmitted */
u16 CharactersReceived; /**< Number of characters received */
u16 ReceiveOverrunErrors; /**< Number of receive overruns */
u16 ReceiveParityErrors; /**< Number of receive parity errors */
u16 ReceiveFramingErrors; /**< Number of receive framing errors */
u16 ReceiveBreakDetected; /**< Number of receive breaks */
} XUartNs550Stats;
/**
* The XUartNs550 driver instance data. The user is required to allocate a
* variable of this type for every UART 16550/16450 device in the system.
* A pointer to a variable of this type is then passed to the driver API
* functions.
*/
typedef struct {
XUartNs550Stats Stats; /**< Statistics */
u32 BaseAddress; /**< Base address of device */
u32 InputClockHz; /**< Input clock frequency */
int IsReady; /**< Device is initialized and ready */
u32 BaudRate; /**< Current baud rate of hw */
u8 LastErrors; /**< The accumulated errors */
XUartNs550Buffer SendBuffer; /**< Send Buffer */
XUartNs550Buffer ReceiveBuffer; /**< Receive Buffer */
XUartNs550_Handler Handler; /**< Call back handler */
void *CallBackRef; /* Callback reference for control handler */
} XUartNs550;
/***************** Macros (Inline Functions) Definitions ********************/
/************************** Function Prototypes *****************************/
/*
* Initialization functions in xuartns550_sinit.c
*/
int XUartNs550_Initialize(XUartNs550 *InstancePtr, u16 DeviceId);
XUartNs550_Config *XUartNs550_LookupConfig(u16 DeviceId);
/*
* Required functions in xuartns550.c
*/
int XUartNs550_CfgInitialize(XUartNs550 *InstancePtr,
XUartNs550_Config *Config,
u32 EffectiveAddr);
unsigned int XUartNs550_Send(XUartNs550 *InstancePtr, u8 *BufferPtr,
unsigned int NumBytes);
unsigned int XUartNs550_Recv(XUartNs550 *InstancePtr, u8 *BufferPtr,
unsigned int NumBytes);
/*
* Options functions in xuartns550_options.c
*/
int XUartNs550_SetOptions(XUartNs550 *InstancePtr, u16 Options);
u16 XUartNs550_GetOptions(XUartNs550 *InstancePtr);
int XUartNs550_SetFifoThreshold(XUartNs550 *InstancePtr,
u8 TriggerLevel);
u8 XUartNs550_GetFifoThreshold(XUartNs550 *InstancePtr);
int XUartNs550_IsSending(XUartNs550 *InstancePtr);
u8 XUartNs550_GetLastErrors(XUartNs550 *InstancePtr);
u8 XUartNs550_GetModemStatus(XUartNs550 *InstancePtr);
/*
* Data format functions in xuartns550_format.c
*/
int XUartNs550_SetDataFormat(XUartNs550 *InstancePtr,
XUartNs550Format *Format);
void XUartNs550_GetDataFormat(XUartNs550 *InstancePtr,
XUartNs550Format *Format);
/*
* Interrupt functions in xuartns550_intr.c
*/
void XUartNs550_SetHandler(XUartNs550 *InstancePtr, XUartNs550_Handler FuncPtr,
void *CallBackRef);
void XUartNs550_InterruptHandler(XUartNs550 *InstancePtr);
/*
* Statistics functions in xuartns550_stats.c
*/
void XUartNs550_GetStats(XUartNs550 *InstancePtr, XUartNs550Stats *StatsPtr);
void XUartNs550_ClearStats(XUartNs550 *InstancePtr);
/*
* Self-test functions in xuartns550_selftest.c
*/
int XUartNs550_SelfTest(XUartNs550 *InstancePtr);
#ifdef __cplusplus
}
#endif
#endif /* end of protection macro */