From f8cac651b33efa270e4dfa1292d01a3b5d7a62cf Mon Sep 17 00:00:00 2001 From: wdenk Date: Mon, 26 Aug 2002 22:36:39 +0000 Subject: Initial revision --- board/pcippc2/fpga_serial.c | 132 +++++++++++++++++++++++++++++++++++++++++ board/pcippc2/fpga_serial.h | 34 +++++++++++ board/pcippc2/sconsole.c | 141 ++++++++++++++++++++++++++++++++++++++++++++ board/pcippc2/sconsole.h | 49 +++++++++++++++ 4 files changed, 356 insertions(+) create mode 100644 board/pcippc2/fpga_serial.c create mode 100644 board/pcippc2/fpga_serial.h create mode 100644 board/pcippc2/sconsole.c create mode 100644 board/pcippc2/sconsole.h (limited to 'board/pcippc2') diff --git a/board/pcippc2/fpga_serial.c b/board/pcippc2/fpga_serial.c new file mode 100644 index 000000000..579bfc702 --- /dev/null +++ b/board/pcippc2/fpga_serial.c @@ -0,0 +1,132 @@ +/* + * (C) Copyright 2002 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 +#include +#include + +#include "fpga_serial.h" +#include "hardware.h" +#include "pcippc2.h" + + /* 8 data, 1 stop, no parity + */ +#define LCRVAL 0x03 + /* RTS/DTR + */ +#define MCRVAL 0x03 + /* Clear & enable FIFOs + */ +#define FCRVAL 0x07 + +static void fpga_serial_wait (void); +static void fpga_serial_print (char c); + +void fpga_serial_init (int baudrate) +{ + int clock_divisor = 115200 / baudrate; + + out8 (FPGA (INT, SERIAL_CONFIG), 0x24); + iobarrier_rw (); + + fpga_serial_wait (); + + out8 (UART (IER), 0); + out8 (UART (LCR), LCRVAL | 0x80); + iobarrier_rw (); + out8 (UART (DLL), clock_divisor & 0xff); + out8 (UART (DLM), clock_divisor >> 8); + iobarrier_rw (); + out8 (UART (LCR), LCRVAL); + iobarrier_rw (); + out8 (UART (MCR), MCRVAL); + out8 (UART (FCR), FCRVAL); + iobarrier_rw (); +} + +void fpga_serial_putc (char c) +{ + if (c) { + fpga_serial_print (c); + } +} + +void fpga_serial_puts (const char *s) +{ + while (*s) { + fpga_serial_print (*s++); + } +} + +int fpga_serial_getc (void) +{ + while ((in8 (UART (LSR)) & 0x01) == 0); + + return in8 (UART (RBR)); +} + +int fpga_serial_tstc (void) +{ + return (in8 (UART (LSR)) & 0x01) != 0; +} + +void fpga_serial_setbrg (void) +{ + DECLARE_GLOBAL_DATA_PTR; + + int clock_divisor = 115200 / gd->baudrate; + + fpga_serial_wait (); + + out8 (UART (LCR), LCRVAL | 0x80); + iobarrier_rw (); + out8 (UART (DLL), clock_divisor & 0xff); + out8 (UART (DLM), clock_divisor >> 8); + iobarrier_rw (); + out8 (UART (LCR), LCRVAL); + iobarrier_rw (); +} + +static void fpga_serial_wait (void) +{ + while ((in8 (UART (LSR)) & 0x40) == 0); +} + +static void fpga_serial_print (char c) +{ + if (c == '\n') { + while ((in8 (UART (LSR)) & 0x20) == 0); + + out8 (UART (THR), '\r'); + iobarrier_rw (); + } + + while ((in8 (UART (LSR)) & 0x20) == 0); + + out8 (UART (THR), c); + iobarrier_rw (); + + if (c == '\n') { + fpga_serial_wait (); + } +} diff --git a/board/pcippc2/fpga_serial.h b/board/pcippc2/fpga_serial.h new file mode 100644 index 000000000..92c9cdd33 --- /dev/null +++ b/board/pcippc2/fpga_serial.h @@ -0,0 +1,34 @@ +/* + * (C) Copyright 2002 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 + */ + +#ifndef _FPGA_SERIAL_H_ +#define _FPGA_SERIAL_H_ + +extern void fpga_serial_init (int); +extern void fpga_serial_putc (char); +extern void fpga_serial_puts (const char *); +extern int fpga_serial_getc (void); +extern int fpga_serial_tstc (void); +extern void fpga_serial_setbrg (void); + +#endif diff --git a/board/pcippc2/sconsole.c b/board/pcippc2/sconsole.c new file mode 100644 index 000000000..a9f2b2981 --- /dev/null +++ b/board/pcippc2/sconsole.c @@ -0,0 +1,141 @@ +/* + * (C) Copyright 2002 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 +#include + +#include "sconsole.h" + +void (*sconsole_putc) (char) = 0; +void (*sconsole_puts) (const char *) = 0; +int (*sconsole_getc) (void) = 0; +int (*sconsole_tstc) (void) = 0; +void (*sconsole_setbrg) (void) = 0; + +int serial_init (void) +{ + DECLARE_GLOBAL_DATA_PTR; + + sconsole_buffer_t *sb = SCONSOLE_BUFFER; + + sb->pos = 0; + sb->size = 0; + sb->baud = gd->baudrate; + sb->max_size = CFG_SCONSOLE_SIZE - sizeof (sconsole_buffer_t); + + return (0); +} + +void serial_putc (char c) +{ + if (sconsole_putc) { + (*sconsole_putc) (c); + } else { + sconsole_buffer_t *sb = SCONSOLE_BUFFER; + + if (c) { + sb->data[sb->pos++] = c; + if (sb->pos == sb->max_size) { + sb->pos = 0; + } + if (sb->size < sb->max_size) { + sb->size++; + } + } + } +} + +void serial_puts (const char *s) +{ + if (sconsole_puts) { + (*sconsole_puts) (s); + } else { + sconsole_buffer_t *sb = SCONSOLE_BUFFER; + + while (*s) { + sb->data[sb->pos++] = *s++; + if (sb->pos == sb->max_size) { + sb->pos = 0; + } + if (sb->size < sb->max_size) { + sb->size++; + } + } + } +} + +int serial_getc (void) +{ + if (sconsole_getc) { + return (*sconsole_getc) (); + } else { + return 0; + } +} + +int serial_tstc (void) +{ + if (sconsole_tstc) { + return (*sconsole_tstc) (); + } else { + return 0; + } +} + +void serial_setbrg (void) +{ + DECLARE_GLOBAL_DATA_PTR; + + if (sconsole_setbrg) { + (*sconsole_setbrg) (); + } else { + sconsole_buffer_t *sb = SCONSOLE_BUFFER; + + sb->baud = gd->baudrate; + } +} + +int sconsole_get_baudrate (void) +{ + sconsole_buffer_t *sb = SCONSOLE_BUFFER; + + return sb->baud; +} + +void sconsole_flush (void) +{ + if (sconsole_putc) { + sconsole_buffer_t *sb = SCONSOLE_BUFFER; + unsigned int end = sb->pos < sb->size + ? sb->pos + sb->max_size - sb->size + : sb->pos - sb->size; + + while (sb->size) { + (*sconsole_putc) (sb->data[end++]); + if (end == sb->max_size) { + end = 0; + } + sb->size--; + } + } +} diff --git a/board/pcippc2/sconsole.h b/board/pcippc2/sconsole.h new file mode 100644 index 000000000..40fd75b81 --- /dev/null +++ b/board/pcippc2/sconsole.h @@ -0,0 +1,49 @@ +/* + * (C) Copyright 2002 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 + */ + +#ifndef _SCONSOLE_H_ +#define _SCONSOLE_H_ + +#include + +typedef struct sconsole_buffer_s +{ + unsigned long size; + unsigned long max_size; + unsigned long pos; + unsigned long baud; + char data [1]; +} sconsole_buffer_t; + +#define SCONSOLE_BUFFER ((sconsole_buffer_t *) CFG_SCONSOLE_ADDR) + +extern void (* sconsole_putc) (char); +extern void (* sconsole_puts) (const char *); +extern int (* sconsole_getc) (void); +extern int (* sconsole_tstc) (void); +extern void (* sconsole_setbrg) (void); + +extern void sconsole_flush (void); +extern int sconsole_get_baudrate (void); + +#endif -- cgit v1.2.3