From 89c63fc6350412d564106e799a80840b973b0f83 Mon Sep 17 00:00:00 2001 From: patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> Date: Wed, 30 Jan 2008 00:59:17 +0000 Subject: [PATCH] Added low-level console driver git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@585 42af7a65-404d-4744-a932-0658087f49c3 --- ChangeLog | 1 + Documentation/NuttX.html | 1 + TODO | 6 +- arch/z16/src/common/up_initialize.c | 6 ++ arch/z16/src/common/up_internal.h | 20 +++- arch/z16/src/z16f/z16f_head.S | 14 ++- arch/z16/src/z16f/z16f_lowuart.S | 6 +- arch/z16/src/z16f/z16f_serial.c | 30 ++++-- configs/z16f2800100zcog/ostest/defconfig | 1 + drivers/Makefile | 2 +- drivers/lowconsole.c | 124 +++++++++++++++++++++++ drivers/serial.c | 8 ++ 12 files changed, 197 insertions(+), 22 deletions(-) create mode 100755 drivers/lowconsole.c diff --git a/ChangeLog b/ChangeLog index ad99a0baa1..c812bf7738 100644 --- a/ChangeLog +++ b/ChangeLog @@ -306,3 +306,4 @@ * Add support for Windows native toolchains that cannot follow Cygwin soft links * Modified serial driver interface to handle hardware with non-16550A-like interrupt architecture (like the Z16F) + * Added a "dumb" serial console driver to simply OS bringup diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html index 38bea91aa0..2c7d6531a9 100644 --- a/Documentation/NuttX.html +++ b/Documentation/NuttX.html @@ -984,6 +984,7 @@ Other memory: * Add support for Windows native toolchains that cannot follow Cygwin soft links * Modified serial driver interface to handle hardware with non-16550A-like interrupt architecture (like the Z16F) + * Added a "dumb" serial console driver to simply OS bringup </pre></ul> <table width ="100%"> diff --git a/TODO b/TODO index e5a4b51d1a..8029936d15 100644 --- a/TODO +++ b/TODO @@ -21,7 +21,7 @@ NuttX TODO List (Last updated January 6, 2008) (2) ARM/LPC214x (arch/arm/src/lpc214x/) (4) pjrc-8052 / MCS51 (arch/pjrc-8051/) (2) z80 (arch/z80/) - (2) z16 (arch/z16/) + (3) z16 (arch/z16/) o Task/Scheduler (sched/) ^^^^^^^^^^^^^^^^^^^^^^^ @@ -382,3 +382,7 @@ o z16 (arch/z16) Status: Open Priority: Medium. A polled, write-only serial driver is used in the interim for system testing. + + Description: Signals are not functional + Status: Open + Priority: Medium diff --git a/arch/z16/src/common/up_initialize.c b/arch/z16/src/common/up_initialize.c index 8a30d33ad1..b7fc643d23 100644 --- a/arch/z16/src/common/up_initialize.c +++ b/arch/z16/src/common/up_initialize.c @@ -160,7 +160,13 @@ void up_initialize(void) /* Initialize the serial device driver */ +#ifdef CONFIG_USE_SERIALDRIVER up_serialinit(); +#endif + +#ifdef CONFIG_USE_LOWCONSOLE + lowconsole_init(); +#endif /* Initialize the netwok */ diff --git a/arch/z16/src/common/up_internal.h b/arch/z16/src/common/up_internal.h index f6acb97a68..144fee7542 100644 --- a/arch/z16/src/common/up_internal.h +++ b/arch/z16/src/common/up_internal.h @@ -58,6 +58,17 @@ #undef CONFIG_SUPPRESS_UART_CONFIG /* Do not reconfig UART */ #undef CONFIG_DUMP_ON_EXIT /* Dump task state on exit */ +/* Determine which (if any) console driver to use */ + +#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || \ + CONFIG_NFILE_DESCRIPTORS == 0 || defined(CONFIG_DEV_LOWCONSOLE) +# define CONFIG_USE_LOWCONSOLE 1 +# define CONFIG_USE_LOWUARTINIT 1 +#elif defined(CONFIG_DEV_CONSOLE) && CONFIG_NFILE_DESCRIPTORS > 0 +# define CONFIG_USE_SERIALDRIVER 1 +# define CONFIG_USE_EARLYSERIALINIT 1 +#endif + /* Macros for portability */ #define IN_INTERRUPT (current_regs != NULL) @@ -118,12 +129,13 @@ void up_addregion(void); /* Defined in up_serial.c */ -#if CONFIG_NFILE_DESCRIPTORS > 0 +#ifdef CONFIG_USE_SERIALDRIVER extern void up_earlyserialinit(void); extern void up_serialinit(void); -#else -# define up_earlyserialinit() -# define up_serialinit() +#endif + +#ifdef CONFIG_USE_LOWCONSOLE +extern void lowconsole_init(void); #endif /* Defined in up_timerisr.c */ diff --git a/arch/z16/src/z16f/z16f_head.S b/arch/z16/src/z16f/z16f_head.S index f6108c250a..88b9ca5bb2 100755 --- a/arch/z16/src/z16f/z16f_head.S +++ b/arch/z16/src/z16f/z16f_head.S @@ -40,6 +40,11 @@ #include <nuttx/config.h> #include <arch/irq.h> +#include "common/up_internal.h" + +/************************************************************************** + * Definitions + **************************************************************************/ /************************************************************************** * External References / External Definitions @@ -50,10 +55,9 @@ #ifdef CONFIG_ARCH_LEDS xref _up_ledinit:EROM #endif -#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || CONFIG_NFILE_DESCRIPTORS == 0 +#if defined(CONFIG_USE_LOWUARTINIT) xref _z16f_lowuartinit:EROM -#endif -#if defined(CONFIG_DEV_CONSOLE) && CONFIG_NFILE_DESCRIPTORS > 0 +#elif defined(CONFIG_USE_EARLYSERIALINIT) xref _up_earlyserialinit:EROM #endif xref _os_start:EROM @@ -157,7 +161,7 @@ _z16f_reset: #endif /* Perform VERY early UART initialization so that we can use it here */ -#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || CONFIG_NFILE_DESCRIPTORS == 0 +#ifdef CONFIG_USE_LOWUARTINIT call _z16f_lowuartinit /* Initialize the UART for debugging */ #endif /* Initialize the hardware stack overflow register */ @@ -210,7 +214,7 @@ _z16f_reset8: call _z16f_lowinit /* Perform low-level hardware initialization */ -#if defined(CONFIG_DEV_CONSOLE) && CONFIG_NFILE_DESCRIPTORS > 0 +#ifdef CONFIG_USE_EARLYSERIALINIT /* Perform early serial initialization */ call _up_earlyserialinit diff --git a/arch/z16/src/z16f/z16f_lowuart.S b/arch/z16/src/z16f/z16f_lowuart.S index bea5f25fc5..1dedf16b3c 100755 --- a/arch/z16/src/z16f/z16f_lowuart.S +++ b/arch/z16/src/z16f/z16f_lowuart.S @@ -40,8 +40,9 @@ #include <nuttx/config.h> #include "chip/chip.h" +#include "common/up_internal.h" -#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || CONFIG_NFILE_DESCRIPTORS == 0 +#ifdef CONFIG_USE_LOWUARTINIT /************************************************************************* * External References / External Definitions @@ -120,6 +121,7 @@ _z16f_lowuartinit: ld.b Z16F_UART0_CTL0, r0 /* Z16F_UART0_CTL0 = %c0 */ #endif ret /* Return */ +#endif /* CONFIG_USE_LOWUARTINIT */ /************************************************************************* * Name: _up_lowputc @@ -222,7 +224,5 @@ _up_lowgetc3: /* Return value in r0 */ ret /* Return */ #endif -#endif /* CONFIG_ARCH_LOWPUTC || CONFIG_ARCH_LOWGETC */ - end diff --git a/arch/z16/src/z16f/z16f_serial.c b/arch/z16/src/z16f/z16f_serial.c index ce40a497f5..1446c5c578 100644 --- a/arch/z16/src/z16f/z16f_serial.c +++ b/arch/z16/src/z16f/z16f_serial.c @@ -55,14 +55,12 @@ #include "os_internal.h" #include "up_internal.h" -#if CONFIG_NFILE_DESCRIPTORS > 0 +#ifdef CONFIG_USE_SERIALDRIVER /**************************************************************************** * Definitions ****************************************************************************/ -#define BASE_BAUD 115200 - /* System clock frequency value from ZDS target settings */ extern _Erom unsigned long SYS_CLK_FREQ; @@ -737,7 +735,7 @@ int up_putc(int ch) return ch; } -#else /* CONFIG_NFILE_DESCRIPTORS > 0 */ +#else /* CONFIG_USE_SERIALDRIVER */ /**************************************************************************** * Definitions @@ -755,11 +753,23 @@ int up_putc(int ch) putreg8((ubyte)(ch), Z16F_UART0_TXD) #endif +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Private Variables + ****************************************************************************/ + /**************************************************************************** * Private Functions ****************************************************************************/ -static void _up_putc(int ch) +/**************************************************************************** + * Name: z16f_putc + ****************************************************************************/ + +static void z16f_putc(int ch) { int tmp; for (tmp = 1000 ; tmp > 0 && !z16f_contrde(); tmp--); @@ -770,6 +780,10 @@ static void _up_putc(int ch) * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: up_putc + ****************************************************************************/ + int up_putc(int ch) { /* Check for LF */ @@ -778,13 +792,13 @@ int up_putc(int ch) { /* Output CR before LF */ - _up_putc('\r'); + z16f_putc('\r'); } /* Output character */ - _up_putc(ch); + z16f_putc(ch); return ch; } -#endif /* CONFIG_NFILE_DESCRIPTORS > 0 */ +#endif /* CONFIG_USE_SERIALDRIVER */ diff --git a/configs/z16f2800100zcog/ostest/defconfig b/configs/z16f2800100zcog/ostest/defconfig index eb24435af2..4e95b886ad 100644 --- a/configs/z16f2800100zcog/ostest/defconfig +++ b/configs/z16f2800100zcog/ostest/defconfig @@ -152,6 +152,7 @@ CONFIG_START_MONTH=1 CONFIG_START_DAY=28 CONFIG_JULIAN_TIME=n CONFIG_DEV_CONSOLE=y +CONFIG_DEV_LOWCONSOLE=y # # The following can be used to disable categories of diff --git a/drivers/Makefile b/drivers/Makefile index 1655629d73..d105e75ea2 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -44,7 +44,7 @@ AOBJS = $(ASRCS:.S=$(OBJEXT)) CSRCS = ifneq ($(CONFIG_NFILE_DESCRIPTORS),0) -CSRCS += dev_null.c serial.c +CSRCS += dev_null.c serial.c lowconsole.c endif CSRCS += $(NET_CSRCS) COBJS = $(CSRCS:.c=$(OBJEXT)) diff --git a/drivers/lowconsole.c b/drivers/lowconsole.c new file mode 100755 index 0000000000..743f09a0a5 --- /dev/null +++ b/drivers/lowconsole.c @@ -0,0 +1,124 @@ +/**************************************************************************** + * drivers/lowconsole.c + * + * Copyright (C) 2008 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <spudmonkey@racsa.co.cr> + * + * 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 NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <sys/types.h> +#include <errno.h> +#include <debug.h> + +#include <nuttx/arch.h> +#include <nuttx/fs.h> + +/**************************************************************************** + * Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static ssize_t lowconsole_read(struct file *filep, char *buffer, size_t buflen); +static ssize_t lowconsole_write(struct file *filep, const char *buffer, size_t buflen); +static int lowconsole_ioctl(struct file *filep, int cmd, unsigned long arg); + +/**************************************************************************** + * Private Variables + ****************************************************************************/ + +struct file_operations g_serialops = +{ + 0, /* open */ + 0, /* close */ + lowconsole_read, /* read */ + lowconsole_write, /* write */ + 0, /* seek */ + lowconsole_ioctl /* ioctl */ +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: lowconsole_ioctl + ****************************************************************************/ + +static int lowconsole_ioctl(struct file *filep, int cmd, unsigned long arg) +{ + *get_errno_ptr() = ENOTTY; + return ERROR; +} + +/**************************************************************************** + * Name: lowconsole_read + ****************************************************************************/ + +static ssize_t lowconsole_read(struct file *filep, char *buffer, size_t buflen) +{ + return 0; +} + +/**************************************************************************** + * Name: lowconsole_write + ****************************************************************************/ + +static ssize_t lowconsole_write(struct file *filep, const char *buffer, size_t buflen) +{ + ssize_t ret = buflen; + + for (; buflen; buflen--) + { + up_putc(*buffer++); + } + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: lowconsole_init +****************************************************************************/ + +void lowconsole_init(void) +{ + (void)register_driver("/dev/console", &g_serialops, 0666, NULL); +} diff --git a/drivers/serial.c b/drivers/serial.c index 153ee431dd..2f0f5703fd 100644 --- a/drivers/serial.c +++ b/drivers/serial.c @@ -344,14 +344,22 @@ static int uart_close(struct file *filep) while (dev->xmit.head != dev->xmit.tail) { +#ifndef CONFIG_DISABLE_SIGNALS usleep(500*1000); +#else + up_udelay(500*1000); +#endif } /* And wait for the TX fifo to drain */ while (!uart_txempty(dev)) { +#ifndef CONFIG_DISABLE_SIGNALS usleep(500*1000); +#else + up_udelay(500*1000); +#endif } /* Free the IRQ and disable the UART */ -- GitLab