From 6ce599cdf62258ce2eaf7a2a9c9c3407cf74cee3 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 15 Oct 2001 18:01:50 +0000 Subject: 2001-10-13 Ralf Corsepius * configure.ac: Remove AC_SUBST(CPU_CLOCK_RATE_HZ), add START_HW_INIT-support macros, add console/Makefile. * Makefile.am: Add console SUBDIR. * hw_init/Makefile.am: Fix C_FILES, remove AM_CPPFLAGS/HZ. * include/Makefile.am: Add bspopts.h. * include/bsp.h: Comment out SH4_CPU_HZ_Frequency. * startup/bspstart.c: Comment out SH4_CPU_HZ_Frequency. * startup/linkcmds: Comment out OUTPUT_FORMAT for coff compatibility. * wrapup/Makefile.am: Add console to BSP_PIECES. * console/Makefile.am: New. * console/console.c: Moved from libcpu/sh/sh7750/sci/console.c. --- c/src/lib/libbsp/sh/gensh4/ChangeLog | 15 + c/src/lib/libbsp/sh/gensh4/Makefile.am | 2 +- c/src/lib/libbsp/sh/gensh4/configure.ac | 12 +- c/src/lib/libbsp/sh/gensh4/console/Makefile.am | 32 ++ c/src/lib/libbsp/sh/gensh4/console/console.c | 486 +++++++++++++++++++++++++ c/src/lib/libbsp/sh/gensh4/hw_init/Makefile.am | 5 +- c/src/lib/libbsp/sh/gensh4/include/Makefile.am | 2 +- c/src/lib/libbsp/sh/gensh4/include/bsp.h | 2 + c/src/lib/libbsp/sh/gensh4/startup/bspstart.c | 2 + c/src/lib/libbsp/sh/gensh4/startup/linkcmds | 3 +- c/src/lib/libbsp/sh/gensh4/wrapup/Makefile.am | 2 +- 11 files changed, 554 insertions(+), 9 deletions(-) create mode 100644 c/src/lib/libbsp/sh/gensh4/console/Makefile.am create mode 100644 c/src/lib/libbsp/sh/gensh4/console/console.c (limited to 'c/src/lib/libbsp/sh/gensh4') diff --git a/c/src/lib/libbsp/sh/gensh4/ChangeLog b/c/src/lib/libbsp/sh/gensh4/ChangeLog index a4d54adca7..3b0396d9a5 100644 --- a/c/src/lib/libbsp/sh/gensh4/ChangeLog +++ b/c/src/lib/libbsp/sh/gensh4/ChangeLog @@ -1,3 +1,18 @@ +2001-10-13 Ralf Corsepius + + * configure.ac: Remove AC_SUBST(CPU_CLOCK_RATE_HZ), add + START_HW_INIT-support macros, add console/Makefile. + * Makefile.am: Add console SUBDIR. + * hw_init/Makefile.am: Fix C_FILES, remove AM_CPPFLAGS/HZ. + * include/Makefile.am: Add bspopts.h. + * include/bsp.h: Comment out SH4_CPU_HZ_Frequency. + * startup/bspstart.c: Comment out SH4_CPU_HZ_Frequency. + * startup/linkcmds: Comment out OUTPUT_FORMAT for coff + compatibility. + * wrapup/Makefile.am: Add console to BSP_PIECES. + * console/Makefile.am: New. + * console/console.c: Moved from libcpu/sh/sh7750/sci/console.c. + 2001-10-12 Ralf Corsepius * configure.ac: Add bspopts.h; Add CPU_CLOCK_RATE_HZ. diff --git a/c/src/lib/libbsp/sh/gensh4/Makefile.am b/c/src/lib/libbsp/sh/gensh4/Makefile.am index 253fbb8310..5eb0b28573 100644 --- a/c/src/lib/libbsp/sh/gensh4/Makefile.am +++ b/c/src/lib/libbsp/sh/gensh4/Makefile.am @@ -7,7 +7,7 @@ ACLOCAL_AMFLAGS = -I ../../../../../../aclocal ## wrapup is the one that actually builds and installs the library ## from the individual .rel files built in other directories -SUBDIRS = include start startup hw_init wrapup +SUBDIRS = include start startup console hw_init wrapup include $(top_srcdir)/../../bsp.am diff --git a/c/src/lib/libbsp/sh/gensh4/configure.ac b/c/src/lib/libbsp/sh/gensh4/configure.ac index 5fd3653223..bdbfa85cec 100644 --- a/c/src/lib/libbsp/sh/gensh4/configure.ac +++ b/c/src/lib/libbsp/sh/gensh4/configure.ac @@ -22,12 +22,21 @@ RTEMS_CANONICAL_HOST ## bsp-specific options CPU_CLOCK_RATE_HZ=${CPU_CLOCK_RATE_HZ-96000000} -AC_SUBST(CPU_CLOCK_RATE_HZ) AC_DEFINE_UNQUOTED( [CPU_CLOCK_RATE_HZ], [$CPU_CLOCK_RATE_HZ], [cpu clock rate in HZ]) +# START_HW_INIT +# This switch selects whether 'early_hw_init()' is called from +# 'start.S'; 'bsp_hw_init()' is always called from 'bspstart.c' +# +START_HW_INIT=${START_HW_INIT-1} +AC_DEFINE_UNQUOTED( + [START_HW_INIT], + [$START_HW_INIT], + [Whether to call early_hw_init from start.S]) + AM_CONFIG_HEADER(include/bspopts.h) RTEMS_PROJECT_ROOT @@ -37,6 +46,7 @@ include/Makefile start/Makefile startup/Makefile hw_init/Makefile +console/Makefile wrapup/Makefile ]) AC_OUTPUT diff --git a/c/src/lib/libbsp/sh/gensh4/console/Makefile.am b/c/src/lib/libbsp/sh/gensh4/console/Makefile.am new file mode 100644 index 0000000000..81c2d41de8 --- /dev/null +++ b/c/src/lib/libbsp/sh/gensh4/console/Makefile.am @@ -0,0 +1,32 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +PGM = $(ARCH)/console.rel + +C_FILES = console.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by +# ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/sh/gensh4/console/console.c b/c/src/lib/libbsp/sh/gensh4/console/console.c new file mode 100644 index 0000000000..126e88949c --- /dev/null +++ b/c/src/lib/libbsp/sh/gensh4/console/console.c @@ -0,0 +1,486 @@ +/* + * Console driver for SH-4 UART modules + * + * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia + * Author: Alexandra Kossovsky + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include + +#include +#include +#include "sh/sh4uart.h" + +/* Descriptor structures for two on-chip UART channels */ +sh4uart sh4_uarts[2]; + +/* Console operations mode: + * 0 - raw (non-termios) polled input/output + * 1 - termios-based polled input/output + * 2 - termios-based interrupt-driven input/output + * 3 - non-termios over gdb stub + */ +int console_mode = 3; +#define CONSOLE_MODE_RAW (0) +#define CONSOLE_MODE_POLL (1) +#define CONSOLE_MODE_INT (2) +#define CONSOLE_MODE_IPL (3) + +/* Wrapper functions for SH-4 UART generic driver */ + +/* console_poll_read -- + * wrapper for poll read function + * + * PARAMETERS: + * minor - minor device number + * + * RETURNS: + * character code readed from UART, or -1 if there is no characters + * available + */ +static int +console_poll_read(int minor) +{ + return sh4uart_poll_read(&sh4_uarts[minor]); +} + +/* console_interrupt_write -- + * wrapper for interrupt write function + * + * PARAMETERS: + * minor - minor device number + * buf - output buffer + * len - output buffer length + * + * RETURNS: + * result code + */ +static int +console_interrupt_write(int minor, const char *buf, int len) +{ + return sh4uart_interrupt_write(&sh4_uarts[minor], buf, len); +} + +/* console_poll_write -- + * wrapper for polling mode write function + * + * PARAMETERS: + * minor - minor device number + * buf - output buffer + * len - output buffer length + * + * RETURNS: + * result code + */ +static int +console_poll_write(int minor, const char *buf, int len) +{ + return sh4uart_poll_write(&sh4_uarts[minor], buf, len); +} + +/* console_set_attributes -- + * wrapper for hardware-dependent termios attributes setting + * + * PARAMETERS: + * minor - minor device number + * t - pointer to the termios structure + * + * RETURNS: + * result code + */ +static int +console_set_attributes(int minor, const struct termios *t) +{ + return sh4uart_set_attributes(&sh4_uarts[minor], t); +} + +/* console_stop_remote_tx -- + * wrapper for stopping data flow from remote party. + * + * PARAMETERS: + * minor - minor device number + * + * RETURNS: + * result code + */ +static int +console_stop_remote_tx(int minor) +{ + if (minor < sizeof(sh4_uarts)/sizeof(sh4_uarts[0])) + return sh4uart_stop_remote_tx(&sh4_uarts[minor]); + else + return RTEMS_INVALID_NUMBER; +} + +/* console_start_remote_tx -- + * wrapper for resuming data flow from remote party. + * + * PARAMETERS: + * minor - minor device number + * + */ +static int +console_start_remote_tx(int minor) +{ + if (minor < sizeof(sh4_uarts)/sizeof(sh4_uarts[0])) + return sh4uart_start_remote_tx(&sh4_uarts[minor]); + else + return RTEMS_INVALID_NUMBER; +} + +/* console_first_open -- + * wrapper for UART controller initialization functions + * + * PARAMETERS: + * major - major device number + * minor - minor device number + * arg - libio device open argument + * + * RETURNS: + * error code + */ +static int +console_first_open(int major, int minor, void *arg) +{ + rtems_libio_open_close_args_t *args = arg; + rtems_status_code sc; + + sc = sh4uart_init(&sh4_uarts[minor], /* uart */ + args->iop->data1, /* tty */ + minor+1, /* channel */ + (console_mode == CONSOLE_MODE_INT)); + + if (sc == RTEMS_SUCCESSFUL) + sc = sh4uart_reset(&sh4_uarts[minor]); + + return sc; +} + +/* console_last_close -- + * wrapper for UART controller close function + * + * PARAMETERS: + * major - major device number + * minor - minor device number + * arg - libio device close argument + * + * RETURNS: + * error code + */ +static int +console_last_close(int major, int minor, void *arg) +{ + return sh4uart_disable(&sh4_uarts[minor]); +} + +/* console_reserve_resources -- + * reserve termios resources for 2 UART channels + * + * PARAMETERS: + * configuration -- pointer to the RTEMS configuration table + * + * RETURNS: + * none + */ +void +console_reserve_resources(rtems_configuration_table *configuration) +{ + if ((console_mode != CONSOLE_MODE_RAW) && + (console_mode != CONSOLE_MODE_IPL)) + rtems_termios_reserve_resources (configuration, 2); +} + +/* console_initialize -- + * This routine initializes the console IO drivers and register devices + * in RTEMS I/O system. + * + * PARAMETERS: + * major - major console device number + * minor - minor console device number (not used) + * arg - device initialize argument + * + * RETURNS: + * RTEMS error code (RTEMS_SUCCESSFUL if device initialized successfuly) + */ +rtems_device_driver +console_initialize(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) +{ + rtems_status_code status; + +#ifdef SH4_WITH_IPL + /* booting from flash we cannot have IPL console */ + if (boot_mode != SH4_BOOT_MODE_IPL && console_mode == CONSOLE_MODE_IPL) + console_mode = CONSOLE_MODE_INT; + + /* break out from gdb if neccessary */ + if (boot_mode == SH4_BOOT_MODE_IPL && console_mode != CONSOLE_MODE_IPL) + ipl_finish(); +#endif + + /* + * Set up TERMIOS + */ + if ((console_mode != CONSOLE_MODE_RAW) && + (console_mode != CONSOLE_MODE_IPL)) + rtems_termios_initialize (); + + /* + * Register the devices + */ + status = rtems_io_register_name ("/dev/console", major, 0); + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred (status); + + status = rtems_io_register_name ("/dev/aux", major, 1); + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred (status); + + if (console_mode == CONSOLE_MODE_RAW) + { + rtems_status_code sc; + sc = sh4uart_init(&sh4_uarts[0], /* uart */ + NULL, /* tty */ + 1, /* UART channel number */ + 0); /* Poll-mode */ + + if (sc == RTEMS_SUCCESSFUL) + sc = sh4uart_reset(&sh4_uarts[0]); + + sc = sh4uart_init(&sh4_uarts[1], /* uart */ + NULL, /* tty */ + 2, /* UART channel number */ + 0); /* Poll-mode */ + + if (sc == RTEMS_SUCCESSFUL) + sc = sh4uart_reset(&sh4_uarts[1]); + + return sc; + } + + return RTEMS_SUCCESSFUL; +} + +/* console_open -- + * Open console device driver. Pass appropriate termios callback + * functions to termios library. + * + * PARAMETERS: + * major - major device number for console devices + * minor - minor device number for console + * arg - device opening argument + * + * RETURNS: + * RTEMS error code + */ +rtems_device_driver +console_open(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) +{ + static const rtems_termios_callbacks intr_callbacks = { + console_first_open, /* firstOpen */ + console_last_close, /* lastClose */ + NULL, /* pollRead */ + console_interrupt_write, /* write */ + console_set_attributes, /* setAttributes */ + console_stop_remote_tx, /* stopRemoteTx */ + console_start_remote_tx, /* startRemoteTx */ + 1 /* outputUsesInterrupts */ + }; + static const rtems_termios_callbacks poll_callbacks = { + console_first_open, /* firstOpen */ + console_last_close, /* lastClose */ + console_poll_read, /* pollRead */ + console_poll_write, /* write */ + console_set_attributes, /* setAttributes */ + console_stop_remote_tx, /* stopRemoteTx */ + console_start_remote_tx, /* startRemoteTx */ + 0 /* outputUsesInterrupts */ + }; + + switch (console_mode) + { + case CONSOLE_MODE_RAW: + case CONSOLE_MODE_IPL: + return RTEMS_SUCCESSFUL; + + case CONSOLE_MODE_INT: + return rtems_termios_open(major, minor, arg, &intr_callbacks); + + case CONSOLE_MODE_POLL: + return rtems_termios_open(major, minor, arg, &poll_callbacks); + + default: + rtems_fatal_error_occurred(0xC07A1310); + } + + return RTEMS_INTERNAL_ERROR; +} + +/* console_close -- + * Close console device. + * + * PARAMETERS: + * major - major device number for console devices + * minor - minor device number for console + * arg - device close argument + * + * RETURNS: + * RTEMS error code + */ +rtems_device_driver +console_close(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) +{ + if ((console_mode != CONSOLE_MODE_RAW) && + (console_mode != CONSOLE_MODE_IPL)) + return rtems_termios_close (arg); + else + return RTEMS_SUCCESSFUL; +} + +/* console_read -- + * Read from the console device + * + * PARAMETERS: + * major - major device number for console devices + * minor - minor device number for console + * arg - device read argument + * + * RETURNS: + * RTEMS error code + */ +rtems_device_driver +console_read(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) +{ + if ((console_mode != CONSOLE_MODE_RAW) && + (console_mode != CONSOLE_MODE_IPL)) + { + return rtems_termios_read (arg); + } + else + { + rtems_libio_rw_args_t *argp = arg; + char *buf = argp->buffer; + int count = argp->count; + int n = 0; + int c; + while (n < count) + { + do { + c = (console_mode == CONSOLE_MODE_RAW) ? + sh4uart_poll_read(&sh4_uarts[minor]) : + ipl_console_poll_read(minor); + } while (c == -1); + if (c == '\r') + c = '\n'; + *(buf++) = c; + n++; + if (c == '\n') + break; + } + argp->bytes_moved = n; + return RTEMS_SUCCESSFUL; + } +} + +/* console_write -- + * Write to the console device + * + * PARAMETERS: + * major - major device number for console devices + * minor - minor device number for console + * arg - device write argument + * + * RETURNS: + * RTEMS error code + */ +rtems_device_driver +console_write(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) +{ + switch (console_mode) + { + case CONSOLE_MODE_POLL: + case CONSOLE_MODE_INT: + return rtems_termios_write (arg); + case CONSOLE_MODE_RAW: + { + rtems_libio_rw_args_t *argp = arg; + char cr = '\r'; + char *buf = argp->buffer; + int count = argp->count; + int i; + + for (i = 0; i < count; i++) + { + if (*buf == '\n') + sh4uart_poll_write(&sh4_uarts[minor], &cr, 1); + sh4uart_poll_write(&sh4_uarts[minor], buf, 1); + buf++; + } + argp->bytes_moved = count; + return RTEMS_SUCCESSFUL; + } +#ifdef SH4_WITH_IPL + case CONSOLE_MODE_IPL: + { + rtems_libio_rw_args_t *argp = arg; + char *buf = argp->buffer; + int count = argp->count; + ipl_console_poll_write(minor, buf, count); + argp->bytes_moved = count; + return RTEMS_SUCCESSFUL; + } +#endif + default: /* Unreachable */ + return RTEMS_NOT_DEFINED; + } +} + +/* console_control -- + * Handle console device I/O control (IOCTL) + * + * PARAMETERS: + * major - major device number for console devices + * minor - minor device number for console + * arg - device ioctl argument + * + * RETURNS: + * RTEMS error code + */ +rtems_device_driver +console_control(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) +{ + if ((console_mode != CONSOLE_MODE_RAW) && + (console_mode != CONSOLE_MODE_IPL)) + { + return rtems_termios_ioctl (arg); + } + else + { + return RTEMS_SUCCESSFUL; + } +} + + + diff --git a/c/src/lib/libbsp/sh/gensh4/hw_init/Makefile.am b/c/src/lib/libbsp/sh/gensh4/hw_init/Makefile.am index 81fdc58949..82a6fe05ec 100644 --- a/c/src/lib/libbsp/sh/gensh4/hw_init/Makefile.am +++ b/c/src/lib/libbsp/sh/gensh4/hw_init/Makefile.am @@ -8,10 +8,7 @@ VPATH = @srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared PGM = $(ARCH)/hw_init.rel -#C_FILES = hw_init.c bsplibc.c bsppost.c bspstart.c bspclean.c sbrk.c \ -# bootcard.c main.c gnatinstallhandler.c C_FILES = hw_init.c - C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) OBJS = $(C_O_FILES) @@ -24,7 +21,7 @@ include $(top_srcdir)/../../../../../../automake/lib.am # (OPTIONAL) Add local stuff here using += # -AM_CPPFLAGS += -DHZ=$(HZ) +## FIXME: This is gcc-specific. AM_CFLAGS += -fomit-frame-pointer $(PGM): $(OBJS) diff --git a/c/src/lib/libbsp/sh/gensh4/include/Makefile.am b/c/src/lib/libbsp/sh/gensh4/include/Makefile.am index d54ee94993..a0f599c75d 100644 --- a/c/src/lib/libbsp/sh/gensh4/include/Makefile.am +++ b/c/src/lib/libbsp/sh/gensh4/include/Makefile.am @@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = foreign 1.4 -include_HEADERS = bsp.h coverhd.h sdram.h +include_HEADERS = bsp.h bspopts.h coverhd.h sdram.h $(PROJECT_INCLUDE)/%.h: %.h $(INSTALL_DATA) $< $@ diff --git a/c/src/lib/libbsp/sh/gensh4/include/bsp.h b/c/src/lib/libbsp/sh/gensh4/include/bsp.h index 332cd11296..7633dbfeba 100644 --- a/c/src/lib/libbsp/sh/gensh4/include/bsp.h +++ b/c/src/lib/libbsp/sh/gensh4/include/bsp.h @@ -134,10 +134,12 @@ extern unsigned32 WorkSpaceEnd ; extern void *CPU_Interrupt_stack_low ; extern void *CPU_Interrupt_stack_high ; +#if OBSOLETE /* * This variable is nesessary for console driver. */ extern rtems_unsigned32 SH4_CPU_HZ_Frequency; +#endif /* * Defined in start.S diff --git a/c/src/lib/libbsp/sh/gensh4/startup/bspstart.c b/c/src/lib/libbsp/sh/gensh4/startup/bspstart.c index 08b1cc320a..ff2798730f 100644 --- a/c/src/lib/libbsp/sh/gensh4/startup/bspstart.c +++ b/c/src/lib/libbsp/sh/gensh4/startup/bspstart.c @@ -46,10 +46,12 @@ rtems_cpu_table Cpu_table; char *rtems_progname; +#if OBSOLETE /* * This variable is nesessary for console driver. */ unsigned32 SH4_CPU_HZ_Frequency = CPU_CLOCK_RATE_HZ; +#endif /* * Use the shared implementations of the following routines diff --git a/c/src/lib/libbsp/sh/gensh4/startup/linkcmds b/c/src/lib/libbsp/sh/gensh4/startup/linkcmds index 6a0342b538..431cc83069 100644 --- a/c/src/lib/libbsp/sh/gensh4/startup/linkcmds +++ b/c/src/lib/libbsp/sh/gensh4/startup/linkcmds @@ -16,9 +16,10 @@ * $Id$ */ - +/* OUTPUT_FORMAT("elf32-shl", "elf32-shl", "elf32-shl") + */ OUTPUT_ARCH(sh) ENTRY(_start) /* Do we need any of these for elf? diff --git a/c/src/lib/libbsp/sh/gensh4/wrapup/Makefile.am b/c/src/lib/libbsp/sh/gensh4/wrapup/Makefile.am index 4b54756366..674e70d569 100644 --- a/c/src/lib/libbsp/sh/gensh4/wrapup/Makefile.am +++ b/c/src/lib/libbsp/sh/gensh4/wrapup/Makefile.am @@ -6,7 +6,7 @@ AUTOMAKE_OPTIONS = foreign 1.4 -BSP_PIECES = startup hw_init +BSP_PIECES = startup hw_init console # pieces to pick up out of libcpu/sh/sh7750 CPU_PIECES = clock sci timer score -- cgit v1.2.3