[U-Boot-Users] [PATCH] Make Xilinx uartlite driver usable by more than just microblaze
Grant Likely
grant.likely at secretlab.ca
Sat Apr 21 18:19:12 CEST 2007
A number of changes which makes the UARTLITE driver suitable for use by
other architectures (most notibly ppc405 on the Xilinx Virtex).
- Add new config values CONFIG_XILINX_UARTLITE to enable the driver
and CONFIG_XILINX_UARTLITE_BASE for specifying the base address
- Remove Xilinx supplied driver files from include/asm-microblaze. They
don't have GPL compatible copyright notices and they're not needed
anyway.
- Rework driver to use in_be32() and out_be32() macros for register access.
Tested on Xilinx ml403 with ppc405 design.
Signed-off-by: Grant Likely <grant.likely at secretlab.ca>
---
I have not tested this on Microblaze. Can somebody please verify for me?
Also can be pulled from:
git://git.secretlab.ca/git/u-boot.git for-upstream
Thanks,
g.
drivers/serial_xuartlite.c | 61 ++++--
.../asm-microblaze/arch-microblaze/xuartlite_l.h | 256 --------------------
include/asm-microblaze/serial_xuartlite.h | 25 --
include/configs/suzaku.h | 6 +-
4 files changed, 46 insertions(+), 302 deletions(-)
delete mode 100644 include/asm-microblaze/arch-microblaze/xuartlite_l.h
delete mode 100644 include/asm-microblaze/serial_xuartlite.h
diff --git a/drivers/serial_xuartlite.c b/drivers/serial_xuartlite.c
index ed59abe..912744d 100644
--- a/drivers/serial_xuartlite.c
+++ b/drivers/serial_xuartlite.c
@@ -1,5 +1,7 @@
/*
+ * (C) Copyright 2007 Secret Lab Technologies Ltd.
* (C) Copyright 2004 Atmark Techno, Inc.
+ * (C) Copyright 2002 Xilinx Inc.
*
* Yasushi SHOJI <yashi at atmark-techno.com>
*
@@ -24,22 +26,38 @@
#include <config.h>
-#ifdef CONFIG_MICROBLAZE
+#ifdef CONFIG_XILINX_UARTLITE
-#include <asm/serial_xuartlite.h>
+#include <asm/io.h>
-/* FIXME: we should convert these to in32 and out32 */
-#define IO_WORD(offset) (*(volatile unsigned long *)(offset))
-#define IO_SERIAL(offset) IO_WORD(CONFIG_SERIAL_BASE + (offset))
+/* UART Lite register offsets */
+#define XUL_REG_RX 0 /* receive FIFO, read only */
+#define XUL_REG_TX 4 /* transmit FIFO, write only */
+#define XUL_REG_STATUS 8 /* status register, read only */
+#define XUL_REG_CONTROL 12 /* control register, write only */
+
+/* control register bit positions */
+#define XUL_CR_ENABLE_INTR 0x10 /* enable interrupt */
+#define XUL_CR_FIFO_RX_RESET 0x02 /* reset receive FIFO */
+#define XUL_CR_FIFO_TX_RESET 0x01 /* reset transmit FIFO */
-#define IO_SERIAL_RX_FIFO IO_SERIAL(XUL_RX_FIFO_OFFSET)
-#define IO_SERIAL_TX_FIFO IO_SERIAL(XUL_TX_FIFO_OFFSET)
-#define IO_SERIAL_STATUS IO_SERIAL(XUL_STATUS_REG_OFFSET)
-#define IO_SERIAL_CONTROL IO_SERIAL(XUL_CONTROL_REG_OFFSET)
+/* status register bit positions */
+#define XUL_SR_PARITY_ERROR 0x80
+#define XUL_SR_FRAMING_ERROR 0x40
+#define XUL_SR_OVERRUN_ERROR 0x20
+#define XUL_SR_INTR_ENABLED 0x10 /* interrupt enabled */
+#define XUL_SR_TX_FIFO_FULL 0x08 /* transmit FIFO full */
+#define XUL_SR_TX_FIFO_EMPTY 0x04 /* transmit FIFO empty */
+#define XUL_SR_RX_FIFO_FULL 0x02 /* receive FIFO full */
+#define XUL_SR_RX_FIFO_VALID_DATA 0x01 /* data in receive FIFO */
+
+/* FIXME: we should convert these to in32 and out32 */
+#define xul_write(reg, val) out_be32((void*)CONFIG_XILINX_UARTLITE_BASE + reg, val)
+#define xul_read(reg) in_be32((void*)CONFIG_XILINX_UARTLITE_BASE + reg)
int serial_init(void)
{
- /* FIXME: Nothing for now. We should initialize fifo, etc */
+ xul_write(XUL_REG_CONTROL, XUL_CR_FIFO_RX_RESET | XUL_CR_FIFO_TX_RESET);
return 0;
}
@@ -50,27 +68,32 @@ void serial_setbrg(void)
void serial_putc(const char c)
{
- if (c == '\n') serial_putc('\r');
- while (IO_SERIAL_STATUS & XUL_SR_TX_FIFO_FULL);
- IO_SERIAL_TX_FIFO = (unsigned char) (c & 0xff);
+ if (c == '\n')
+ serial_putc('\r');
+
+ /* spin for room in FIFO */
+ while (xul_read(XUL_REG_STATUS) & XUL_SR_TX_FIFO_FULL);
+
+ xul_write(XUL_REG_TX, c & 0xff);
}
void serial_puts(const char * s)
{
- while (*s) {
+ while (*s)
serial_putc(*s++);
- }
}
int serial_getc(void)
{
- while (!(IO_SERIAL_STATUS & XUL_SR_RX_FIFO_VALID_DATA));
- return IO_SERIAL_RX_FIFO & 0xff;
+ /* spin for data */
+ while (!(xul_read(XUL_REG_STATUS) & XUL_SR_RX_FIFO_VALID_DATA));
+
+ return xul_read(XUL_REG_RX) & 0xff;
}
int serial_tstc(void)
{
- return (IO_SERIAL_STATUS & XUL_SR_RX_FIFO_VALID_DATA);
+ return xul_read(XUL_REG_STATUS) & XUL_SR_RX_FIFO_VALID_DATA;
}
-#endif /* CONFIG_MICROBLZE */
+#endif /* CONFIG_XILINX_UARTLITE */
diff --git a/include/asm-microblaze/arch-microblaze/xuartlite_l.h b/include/asm-microblaze/arch-microblaze/xuartlite_l.h
deleted file mode 100644
index b381a0d..0000000
--- a/include/asm-microblaze/arch-microblaze/xuartlite_l.h
+++ /dev/null
@@ -1,256 +0,0 @@
-/*****************************************************************************
-*
-* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"
-* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND
-* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE,
-* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
-* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION
-* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,
-* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE
-* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY
-* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE
-* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
-* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF
-* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE.
-*
-* (c) Copyright 2002 Xilinx Inc.
-* All rights reserved.
-*
-*****************************************************************************/
-/****************************************************************************/
-/**
-*
-* @file xuartlite_l.h
-*
-* This header file contains identifiers and low-level driver functions (or
-* macros) that can be used to access the device. High-level driver functions
-* are defined in xuartlite.h.
-*
-* <pre>
-* MODIFICATION HISTORY:
-*
-* Ver Who Date Changes
-* ----- ---- -------- -----------------------------------------------
-* 1.00b rpm 04/25/02 First release
-* </pre>
-*
-*****************************************************************************/
-
-#ifndef XUARTLITE_L_H /* prevent circular inclusions */
-#define XUARTLITE_L_H /* by using protection macros */
-
-/***************************** Include Files ********************************/
-
-#include "xbasic_types.h"
-#include "xio.h"
-
-/************************** Constant Definitions ****************************/
-
-/* UART Lite register offsets */
-
-#define XUL_RX_FIFO_OFFSET 0 /* receive FIFO, read only */
-#define XUL_TX_FIFO_OFFSET 4 /* transmit FIFO, write only */
-#define XUL_STATUS_REG_OFFSET 8 /* status register, read only */
-#define XUL_CONTROL_REG_OFFSET 12 /* control register, write only */
-
-/* control register bit positions */
-
-#define XUL_CR_ENABLE_INTR 0x10 /* enable interrupt */
-#define XUL_CR_FIFO_RX_RESET 0x02 /* reset receive FIFO */
-#define XUL_CR_FIFO_TX_RESET 0x01 /* reset transmit FIFO */
-
-/* status register bit positions */
-
-#define XUL_SR_PARITY_ERROR 0x80
-#define XUL_SR_FRAMING_ERROR 0x40
-#define XUL_SR_OVERRUN_ERROR 0x20
-#define XUL_SR_INTR_ENABLED 0x10 /* interrupt enabled */
-#define XUL_SR_TX_FIFO_FULL 0x08 /* transmit FIFO full */
-#define XUL_SR_TX_FIFO_EMPTY 0x04 /* transmit FIFO empty */
-#define XUL_SR_RX_FIFO_FULL 0x02 /* receive FIFO full */
-#define XUL_SR_RX_FIFO_VALID_DATA 0x01 /* data in receive FIFO */
-
-/* the following constant specifies the size of the FIFOs, the size of the
- * FIFOs includes the transmitter and receiver such that it is the total number
- * of bytes that the UART can buffer
- */
-#define XUL_FIFO_SIZE 16
-
-/* Stop bits are fixed at 1. Baud, parity, and data bits are fixed on a
- * per instance basis
- */
-#define XUL_STOP_BITS 1
-
-/* Parity definitions
- */
-#define XUL_PARITY_NONE 0
-#define XUL_PARITY_ODD 1
-#define XUL_PARITY_EVEN 2
-
-/**************************** Type Definitions ******************************/
-
-/***************** Macros (Inline Functions) Definitions ********************/
-
-/*****************************************************************************
-*
-* Low-level driver macros and functions. The list below provides signatures
-* to help the user use the macros.
-*
-* void XUartLite_mSetControlReg(u32 BaseAddress, u32 Mask)
-* u32 XUartLite_mGetControlReg(u32 BaseAddress)
-* u32 XUartLite_mGetStatusReg(u32 BaseAddress)
-*
-* Xboolean XUartLite_mIsReceiveEmpty(u32 BaseAddress)
-* Xboolean XUartLite_mIsTransmitFull(u32 BaseAddress)
-* Xboolean XUartLite_mIsIntrEnabled(u32 BaseAddress)
-*
-* void XUartLite_mEnableIntr(u32 BaseAddress)
-* void XUartLite_mDisableIntr(u32 BaseAddress)
-*
-* void XUartLite_SendByte(u32 BaseAddress, u8 Data);
-* u8 XUartLite_RecvByte(u32 BaseAddress);
-*
-*****************************************************************************/
-
-/****************************************************************************/
-/**
-*
-* Set the contents of the control register. Use the XUL_CR_* constants defined
-* above to create the bit-mask to be written to the register.
-*
-* @param BaseAddress is the base address of the device
-* @param Mask is the 32-bit value to write to the control register
-*
-* @return None.
-*
-* @note None.
-*
-*****************************************************************************/
-#define XUartLite_mSetControlReg(BaseAddress, Mask) \
- XIo_Out32((BaseAddress) + XUL_CONTROL_REG_OFFSET, (Mask))
-
-
-/****************************************************************************/
-/**
-*
-* Get the contents of the control register. Use the XUL_CR_* constants defined
-* above to interpret the bit-mask returned.
-*
-* @param BaseAddress is the base address of the device
-*
-* @return A 32-bit value representing the contents of the control register.
-*
-* @note None.
-*
-*****************************************************************************/
-#define XUartLite_mGetControlReg(BaseAddress) \
- XIo_In32((BaseAddress) + XUL_CONTROL_REG_OFFSET)
-
-
-/****************************************************************************/
-/**
-*
-* Get the contents of the status register. Use the XUL_SR_* constants defined
-* above to interpret the bit-mask returned.
-*
-* @param BaseAddress is the base address of the device
-*
-* @return A 32-bit value representing the contents of the status register.
-*
-* @note None.
-*
-*****************************************************************************/
-#define XUartLite_mGetStatusReg(BaseAddress) \
- XIo_In32((BaseAddress) + XUL_STATUS_REG_OFFSET)
-
-
-/****************************************************************************/
-/**
-*
-* Check to see if the receiver has data.
-*
-* @param BaseAddress is the base address of the device
-*
-* @return XTRUE if the receiver is empty, XFALSE if there is data present.
-*
-* @note None.
-*
-*****************************************************************************/
-#define XUartLite_mIsReceiveEmpty(BaseAddress) \
- (!(XUartLite_mGetStatusReg((BaseAddress)) & XUL_SR_RX_FIFO_VALID_DATA))
-
-
-/****************************************************************************/
-/**
-*
-* Check to see if the transmitter is full.
-*
-* @param BaseAddress is the base address of the device
-*
-* @return XTRUE if the transmitter is full, XFALSE otherwise.
-*
-* @note None.
-*
-*****************************************************************************/
-#define XUartLite_mIsTransmitFull(BaseAddress) \
- (XUartLite_mGetStatusReg((BaseAddress)) & XUL_SR_TX_FIFO_FULL)
-
-
-/****************************************************************************/
-/**
-*
-* Check to see if the interrupt is enabled.
-*
-* @param BaseAddress is the base address of the device
-*
-* @return XTRUE if the interrupt is enabled, XFALSE otherwise.
-*
-* @note None.
-*
-*****************************************************************************/
-#define XUartLite_mIsIntrEnabled(BaseAddress) \
- (XUartLite_mGetStatusReg((BaseAddress)) & XUL_SR_INTR_ENABLED)
-
-
-/****************************************************************************/
-/**
-*
-* Enable the device interrupt. Preserve the contents of the control register.
-*
-* @param BaseAddress is the base address of the device
-*
-* @return None.
-*
-* @note None.
-*
-*****************************************************************************/
-#define XUartLite_mEnableIntr(BaseAddress) \
- XUartLite_mSetControlReg((BaseAddress), \
- XUartLite_mGetControlReg((BaseAddress)) | XUL_CR_ENABLE_INTR)
-
-
-/****************************************************************************/
-/**
-*
-* Disable the device interrupt. Preserve the contents of the control register.
-*
-* @param BaseAddress is the base address of the device
-*
-* @return None.
-*
-* @note None.
-*
-*****************************************************************************/
-#define XUartLite_mDisableIntr(BaseAddress) \
- XUartLite_mSetControlReg((BaseAddress), \
- XUartLite_mGetControlReg((BaseAddress)) & ~XUL_CR_ENABLE_INTR)
-
-
-/************************** Function Prototypes *****************************/
-
-void XUartLite_SendByte(u32 BaseAddress, u8 Data);
-u8 XUartLite_RecvByte(u32 BaseAddress);
-
-
-#endif /* end of protection macro */
diff --git a/include/asm-microblaze/serial_xuartlite.h b/include/asm-microblaze/serial_xuartlite.h
deleted file mode 100644
index 6cd1e83..0000000
--- a/include/asm-microblaze/serial_xuartlite.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * (C) Copyright 2004 Atmark Techno, Inc.
- *
- * Yasushi SHOJI <yashi at atmark-techno.com>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <asm/arch/xuartlite_l.h>
diff --git a/include/configs/suzaku.h b/include/configs/suzaku.h
index 8224555..b67a2c1 100644
--- a/include/configs/suzaku.h
+++ b/include/configs/suzaku.h
@@ -60,8 +60,10 @@
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
#include <cmd_confdefs.h>
-#define CFG_UART1_BASE (0xFFFF2000)
-#define CONFIG_SERIAL_BASE CFG_UART1_BASE
+/* Use Xilinx UARTLITE serial port */
+#define CFG_UART1_BASE (0xFFFF2000)
+#define CONFIG_XILINX_UARTLITE 1
+#define CONFIG_XILINX_UARTLITE_BASE CFG_UART1_BASE
/*
* Miscellaneous configurable options
--
1.5.1
More information about the U-Boot
mailing list