blob: 03a44441c510e5c89c7fa8369fdd3ae7bf3e4c61 [file] [log] [blame]
/**
* @file IxUART.h
*
* @date 12-OCT-01
*
* @brief Public header for the Intel IXP400 internal UART, generic driver.
*
* Design Notes:
* This driver allows you to perform the following functions:
* Device Initialization,
* send/receive characters.
*
* Perform Uart IOCTL for the following:
* Set/Get the current baud rate,
* set parity,
* set the number of Stop bits,
* set the character Length (5,6,7,8),
* enable/disable Hardware flow control.
*
* Only Polled mode is supported for now.
*
*
* @par
* IXP400 SW Release version 2.0
*
* -- Copyright Notice --
*
* @par
* Copyright 2001-2005, Intel Corporation.
* All rights reserved.
*
* @par
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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 distribution.
* 3. Neither the name of the Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* @par
* 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 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @par
* -- End of Copyright Notice --
*/
/**
* @defgroup IxUARTAccAPI IXP400 UART Access (IxUARTAcc) API
*
* @brief IXP400 UARTAcc Driver Public API
*
* @{
*/
/* Defaults */
/**
* @defgroup DefaultDefines Defines for Default Values
*
* @brief Default values which can be used for UART configuration
*
* @sa ixUARTDev
*/
/**
* @def IX_UART_DEF_OPTS
*
* @brief The default hardware options to set the UART to -
* no flow control, 8 bit word, 1 stop bit, no parity
*
* @ingroup DefaultDefines
*/
#define IX_UART_DEF_OPTS (CLOCAL | CS8)
/**
* @def IX_UART_DEF_XMIT
*
* @brief The default UART FIFO size - must be no bigger than 64
*
* @ingroup DefaultDefines
*/
#define IX_UART_DEF_XMIT 64
/**
* @def IX_UART_DEF_BAUD
*
* @brief The default UART baud rate - 9600
*
* @ingroup DefaultDefines
*/
#define IX_UART_DEF_BAUD 9600
/**
* @def IX_UART_MIN_BAUD
*
* @brief The minimum UART baud rate - 9600
*
* @ingroup DefaultDefines
*/
#define IX_UART_MIN_BAUD 9600
/**
* @def IX_UART_MAX_BAUD
*
* @brief The maximum UART baud rate - 926100
*
* @ingroup DefaultDefines
*/
#define IX_UART_MAX_BAUD 926100
/**
* @def IX_UART_XTAL
*
* @brief The UART clock speed
*
* @ingroup DefaultDefines
*/
#define IX_UART_XTAL 14745600
/* IOCTL commands (Request codes) */
/**
* @defgroup IoctlCommandDefines Defines for IOCTL Commands
*
* @brief IOCTL Commands (Request codes) which can be used
* with @ref ixUARTIoctl
*/
/**
* @ingroup IoctlCommandDefines
*
* @def IX_BAUD_SET
*
* @brief Set the baud rate
*/
#define IX_BAUD_SET 0
/**
* @ingroup IoctlCommandDefines
*
* @def IX_BAUD_GET
*
* @brief Get the baud rate
*/
#define IX_BAUD_GET 1
/**
* @ingroup IoctlCommandDefines
* @def IX_MODE_SET
* @brief Set the UART mode of operation
*/
#define IX_MODE_SET 2
/**
* @ingroup IoctlCommandDefines
*
* @def IX_MODE_GET
*
* @brief Get the current UART mode of operation
*/
#define IX_MODE_GET 3
/**
* @ingroup IoctlCommandDefines
*
* @def IX_OPTS_SET
*
* @brief Set the UART device options
*/
#define IX_OPTS_SET 4
/**
* @ingroup IoctlCommandDefines
*
* @def IX_OPTS_GET
*
* @brief Get the UART device options
*/
#define IX_OPTS_GET 5
/**
* @ingroup IoctlCommandDefines
*
* @def IX_STATS_GET
*
* @brief Get the UART statistics
*/
#define IX_STATS_GET 6
/* POSIX style ioctl arguments */
/**
* @defgroup IoctlArgDefines Defines for IOCTL Arguments
*
* @brief POSIX style IOCTL arguments which can be used
* with @ref ixUARTIoctl
*
* @sa ixUARTMode
*/
/**
* @ingroup IoctlArgDefines
*
* @def CLOCAL
*
* @brief Software flow control
*/
#ifdef CLOCAL
#undef CLOCAL
#endif
#define CLOCAL 0x1
/**
* @ingroup IoctlArgDefines
*
* @def CREAD
*
* @brief Enable interrupt receiver
*/
#ifdef CREAD
#undef CREAD
#endif
#define CREAD 0x2
/**
* @ingroup IoctlArgDefines
*
* @def CSIZE
*
* @brief Characters size
*/
#ifdef CSIZE
#undef CSIZE
#endif
#define CSIZE 0xc
/**
* @ingroup IoctlArgDefines
*
* @def CS5
*
* @brief 5 bits
*/
#ifdef CS5
#undef CS5
#endif
#define CS5 0x0
/**
* @ingroup IoctlArgDefines
*
* @def CS6
*
* @brief 6 bits
*/
#ifdef CS6
#undef CS6
#endif
#define CS6 0x4
/**
* @ingroup IoctlArgDefines
*
* @def CS7
*
* @brief 7 bits
*/
#ifdef CS7
#undef CS7
#endif
#define CS7 0x8
/**
* @ingroup IoctlArgDefines
*
* @def CS8
*
* @brief 8 bits
*/
#ifdef CS8
#undef CS8
#endif
#define CS8 0xc
/**
* @ingroup IoctlArgDefines
*
* @def STOPB
*
* @brief Send two stop bits (else one)
*/
#define STOPB 0x20
/**
* @ingroup IoctlArgDefines
*
* @def PARENB
*
* @brief Parity detection enabled (else disabled)
*/
#ifdef PARENB
#undef PARENB
#endif
#define PARENB 0x40
/**
* @ingroup IoctlArgDefines
*
* @def PARODD
*
* @brief Odd parity (else even)
*/
#ifdef PARODD
#undef PARODD
#endif
#define PARODD 0x80
/**
* @enum ixUARTMode
* @brief The mode to set to UART to.
*/
typedef enum
{
INTERRUPT=0, /**< Interrupt mode */
POLLED, /**< Polled mode */
LOOPBACK /**< Loopback mode */
} ixUARTMode;
/**
* @struct ixUARTStats
* @brief Statistics for the UART.
*/
typedef struct
{
UINT32 rxCount;
UINT32 txCount;
UINT32 overrunErr;
UINT32 parityErr;
UINT32 framingErr;
UINT32 breakErr;
} ixUARTStats;
/**
* @struct ixUARTDev
* @brief Device descriptor for the UART.
*/
typedef struct
{
UINT8 *addr; /**< device base address */
ixUARTMode mode; /**< interrupt, polled or loopback */
int baudRate; /**< baud rate */
int freq; /**< UART clock frequency */
int options; /**< hardware options */
int fifoSize; /**< FIFO xmit size */
ixUARTStats stats; /**< device statistics */
} ixUARTDev;
/**
* @ingroup IxUARTAccAPI
*
* @fn IX_STATUS ixUARTInit(ixUARTDev* pUART)
*
* @param pUART @ref ixUARTDev [in] - pointer to UART structure describing our device.
*
* @brief Initialise the UART. This puts the chip in a quiescent state.
*
* @pre The base address for the UART must contain a valid value.
* Also the baud rate and hardware options must contain sensible values
* otherwise the defaults will be used as defined in ixUART.h
*
* @post UART is initialized and ready to send and receive data.
*
* @note This function should only be called once per device.
*
* @retval IX_SUCCESS - UART device successfully initialised.
* @retval IX_FAIL - Critical error, device not initialised.
***************************************************************************/
PUBLIC IX_STATUS ixUARTInit(ixUARTDev* pUART);
/**
* @ingroup IxUARTAccAPI
*
* @fn IX_STATUS ixUARTPollOutput(ixUARTDev* pUART, int outChar)
*
* @param pUART @ref ixUARTDev [out] - pointer to UART structure describing our device.
* @param outChar int [out] - character to transmit.
*
* @brief Transmit a character in polled mode.
*
* @pre UART device must be initialised.
*
* @retval IX_SUCCESS - character was successfully transmitted.
* @retval IX_FAIL - output buffer is full (try again).
***************************************************************************/
PUBLIC IX_STATUS ixUARTPollOutput(ixUARTDev* pUART, int outChar);
/**
* @ingroup IxUARTAccAPI
*
* @fn IX_STATUS ixUARTPollInput(ixUARTDev* pUART, char *inChar)
*
* @param pUART @ref ixUARTDev [in] - pointer to UART structure describing our device.
* @param *inChar char [in] - character read from the device.
*
* @brief Receive a character in polled mode.
*
* @pre UART device must be initialised.
*
* @retval IX_SUCCESS - character was successfully read.
* @retval IX_FAIL - input buffer empty (try again).
***************************************************************************/
PUBLIC IX_STATUS ixUARTPollInput(ixUARTDev* pUART, char *inChar);
/**
* @ingroup IxUARTAccAPI
*
* @fn IX_STATUS ixUARTIoctl(ixUARTDev* pUART, int cmd, void* arg)
*
* @param pUART @ref ixUARTDev [in] - pointer to UART structure describing our device.
* @param cmd int [in] - an ioctl request code.
* @param arg void* [in] - optional argument used to set the device mode,
* baud rate, and hardware options.
*
* @brief Perform I/O control routines on the device.
*
* @retval IX_SUCCESS - requested feature was set/read successfully.
* @retval IX_FAIL - error setting/reading the requested feature.
*
* @sa IoctlCommandDefines
* @sa IoctlArgDefines
***************************************************************************/
PUBLIC IX_STATUS ixUARTIoctl(ixUARTDev* pUART, int cmd, void* arg);
/**
* @} defgroup IxUARTAcc
*/