diff --git a/ChangeLog b/ChangeLog index ad99a0baa124d5c93f5f5b23e369590ab1a366a8..c812bf773869760df2a1685204386de449bfff48 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 38bea91aa08925098793aa6fa72f65d81b527177..2c7d6531a9f11f0f3275a1de93ab23fee3fdfd22 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 e5a4b51d1a3ab5331df5054f6a08d94e40e95b08..8029936d152c8d15b1b340223d0900d5f620c9c7 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 8a30d33ad1c3599b8b795d9c1340c2c0487dc46f..b7fc643d23d044c5059b205a53cb5f65627f22d6 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 f6acb97a683c9c1f456648626b9564ebea94096c..144fee754208d81d7f7301a3d99006f18d709621 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 f6108c250a422884fef21fa2b03b1b880a3620e8..88b9ca5bb27ec5e15e73f389a15a7b803dde3748 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 bea5f25fc5f6e309fd0363ff4aa4e4ac9c3ea1ec..1dedf16b3ce193b12fe1cef910b31ba2ae4406a6 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 ce40a497f5daaeec50f748fb7633f3efedab7d25..1446c5c578324f3882c4468dc4683cd2c56e602c 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 eb24435af29cb52404917faad957a4e5864f93aa..4e95b886add8d0695f66def4373a29a13e8e2542 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 1655629d730eddc465fcc255698a29885e56fb37..d105e75ea29636c20e569e7eca40a4d567e39830 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 0000000000000000000000000000000000000000..743f09a0a515f886c4fba1d73b7dfc9541bd917f --- /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 153ee431dd3a44396b3d79922c18b922bacf04f8..2f0f5703fdf44fee74072408a537312162fc9bd7 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 */