156 lines
4.5 KiB
C
156 lines
4.5 KiB
C
|
#ifndef _uart_h_included_
|
||
|
#define _uart_h_included_
|
||
|
|
||
|
/*
|
||
|
* THIS FILE IS GENERATED -- DO NOT MODIFY BY HAND
|
||
|
*
|
||
|
* include/asm-xtensa/xtensa/xt2000-uart.h -- NatSemi PC16552D DUART
|
||
|
* definitions
|
||
|
*
|
||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||
|
* License. See the file "COPYING" in the main directory of this archive
|
||
|
* for more details.
|
||
|
*
|
||
|
* Copyright (C) 2002 Tensilica Inc.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include <xtensa/xt2000.h>
|
||
|
|
||
|
|
||
|
/* 16550 UART DEVICE REGISTERS
|
||
|
The XT2000 board aligns each register to a 32-bit word but the UART device only uses
|
||
|
one byte of the word, which is the least-significant byte regardless of the
|
||
|
endianness of the core (ie. byte offset 0 for little-endian and 3 for big-endian).
|
||
|
So if using word accesses then endianness doesn't matter.
|
||
|
The macros provided here do that.
|
||
|
*/
|
||
|
struct uart_dev_s {
|
||
|
union {
|
||
|
unsigned int rxb; /* DLAB=0: receive buffer, read-only */
|
||
|
unsigned int txb; /* DLAB=0: transmit buffer, write-only */
|
||
|
unsigned int dll; /* DLAB=1: divisor, least-significant byte latch (was write-only?) */
|
||
|
} w0;
|
||
|
union {
|
||
|
unsigned int ier; /* DLAB=0: interrupt-enable register (was write-only?) */
|
||
|
unsigned int dlm; /* DLAB=1: divisor, most-significant byte latch (was write-only?) */
|
||
|
} w1;
|
||
|
|
||
|
union {
|
||
|
unsigned int isr; /* DLAB=0: interrupt status register, read-only */
|
||
|
unsigned int fcr; /* DLAB=0: FIFO control register, write-only */
|
||
|
unsigned int afr; /* DLAB=1: alternate function register */
|
||
|
} w2;
|
||
|
|
||
|
unsigned int lcr; /* line control-register, write-only */
|
||
|
unsigned int mcr; /* modem control-regsiter, write-only */
|
||
|
unsigned int lsr; /* line status register, read-only */
|
||
|
unsigned int msr; /* modem status register, read-only */
|
||
|
unsigned int scr; /* scratch regsiter, read/write */
|
||
|
};
|
||
|
|
||
|
#define _RXB(u) ((u)->w0.rxb)
|
||
|
#define _TXB(u) ((u)->w0.txb)
|
||
|
#define _DLL(u) ((u)->w0.dll)
|
||
|
#define _IER(u) ((u)->w1.ier)
|
||
|
#define _DLM(u) ((u)->w1.dlm)
|
||
|
#define _ISR(u) ((u)->w2.isr)
|
||
|
#define _FCR(u) ((u)->w2.fcr)
|
||
|
#define _AFR(u) ((u)->w2.afr)
|
||
|
#define _LCR(u) ((u)->lcr)
|
||
|
#define _MCR(u) ((u)->mcr)
|
||
|
#define _LSR(u) ((u)->lsr)
|
||
|
#define _MSR(u) ((u)->msr)
|
||
|
#define _SCR(u) ((u)->scr)
|
||
|
|
||
|
typedef volatile struct uart_dev_s uart_dev_t;
|
||
|
|
||
|
/* IER bits */
|
||
|
#define RCVR_DATA_REG_INTENABLE 0x01
|
||
|
#define XMIT_HOLD_REG_INTENABLE 0x02
|
||
|
#define RCVR_STATUS_INTENABLE 0x04
|
||
|
#define MODEM_STATUS_INTENABLE 0x08
|
||
|
|
||
|
/* FCR bits */
|
||
|
#define _FIFO_ENABLE 0x01
|
||
|
#define RCVR_FIFO_RESET 0x02
|
||
|
#define XMIT_FIFO_RESET 0x04
|
||
|
#define DMA_MODE_SELECT 0x08
|
||
|
#define RCVR_TRIGGER_LSB 0x40
|
||
|
#define RCVR_TRIGGER_MSB 0x80
|
||
|
|
||
|
/* AFR bits */
|
||
|
#define AFR_CONC_WRITE 0x01
|
||
|
#define AFR_BAUDOUT_SEL 0x02
|
||
|
#define AFR_RXRDY_SEL 0x04
|
||
|
|
||
|
/* ISR bits */
|
||
|
#define INT_STATUS(r) ((r)&1)
|
||
|
#define INT_PRIORITY(r) (((r)>>1)&0x7)
|
||
|
|
||
|
/* LCR bits */
|
||
|
#define WORD_LENGTH(n) (((n)-5)&0x3)
|
||
|
#define STOP_BIT_ENABLE 0x04
|
||
|
#define PARITY_ENABLE 0x08
|
||
|
#define EVEN_PARITY 0x10
|
||
|
#define FORCE_PARITY 0x20
|
||
|
#define XMIT_BREAK 0x40
|
||
|
#define DLAB_ENABLE 0x80
|
||
|
|
||
|
/* MCR bits */
|
||
|
#define _DTR 0x01
|
||
|
#define _RTS 0x02
|
||
|
#define _OP1 0x04
|
||
|
#define _OP2 0x08
|
||
|
#define LOOP_BACK 0x10
|
||
|
|
||
|
/* LSR Bits */
|
||
|
#define RCVR_DATA_READY 0x01
|
||
|
#define OVERRUN_ERROR 0x02
|
||
|
#define PARITY_ERROR 0x04
|
||
|
#define FRAMING_ERROR 0x08
|
||
|
#define BREAK_INTERRUPT 0x10
|
||
|
#define XMIT_HOLD_EMPTY 0x20
|
||
|
#define XMIT_EMPTY 0x40
|
||
|
#define FIFO_ERROR 0x80
|
||
|
#define RCVR_READY(u) (_LSR(u)&RCVR_DATA_READY)
|
||
|
#define XMIT_READY(u) (_LSR(u)&XMIT_HOLD_EMPTY)
|
||
|
|
||
|
/* MSR bits */
|
||
|
#define _RDR 0x01
|
||
|
#define DELTA_DSR 0x02
|
||
|
#define DELTA_RI 0x04
|
||
|
#define DELTA_CD 0x08
|
||
|
#define _CTS 0x10
|
||
|
#define _DSR 0x20
|
||
|
#define _RI 0x40
|
||
|
#define _CD 0x80
|
||
|
|
||
|
/* prototypes */
|
||
|
void uart_init( uart_dev_t *u, int bitrate );
|
||
|
void uart_out( uart_dev_t *u, char c );
|
||
|
void uart_puts( uart_dev_t *u, char *s );
|
||
|
char uart_in( uart_dev_t *u );
|
||
|
void uart_enable_rcvr_int( uart_dev_t *u );
|
||
|
void uart_disable_rcvr_int( uart_dev_t *u );
|
||
|
|
||
|
#ifdef DUART16552_1_VADDR
|
||
|
/* DUART present. */
|
||
|
#define DUART_1_BASE (*(uart_dev_t*)DUART16552_1_VADDR)
|
||
|
#define DUART_2_BASE (*(uart_dev_t*)DUART16552_2_VADDR)
|
||
|
#define UART1_PUTS(s) uart_puts( &DUART_1_BASE, s )
|
||
|
#define UART2_PUTS(s) uart_puts( &DUART_2_BASE, s )
|
||
|
#else
|
||
|
/* DUART not configured, use dummy placeholders to allow compiles to work. */
|
||
|
#define DUART_1_BASE (*(uart_dev_t*)0)
|
||
|
#define DUART_2_BASE (*(uart_dev_t*)0)
|
||
|
#define UART1_PUTS(s)
|
||
|
#define UART2_PUTS(s)
|
||
|
#endif
|
||
|
|
||
|
/* Compute 16-bit divisor for baudrate generator, with rounding: */
|
||
|
#define DUART_DIVISOR(crystal,speed) (((crystal)/16 + (speed)/2)/(speed))
|
||
|
|
||
|
#endif /*_uart_h_included_*/
|
||
|
|