From bf27d79c0d6039e36e0471bb3cf21846fa79f4f5 Mon Sep 17 00:00:00 2001 From: patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> Date: Wed, 23 Jan 2008 20:38:12 +0000 Subject: [PATCH] Add preliminary support for Z16F serial port git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@560 42af7a65-404d-4744-a932-0658087f49c3 --- arch/z16/src/z16f/Make.defs | 2 +- arch/z16/src/z16f/chip.h | 58 +- arch/z16/src/z16f/z16f_lowuart.S | 70 +- arch/z16/src/z16f/z16f_serial.c | 701 +++++++++++++++++++++ configs/z16f2800100zcog/ostest/defconfig | 7 +- configs/z16f2800100zcog/src/z16f_lowinit.c | 5 + include/nuttx/serial.h | 4 +- 7 files changed, 809 insertions(+), 38 deletions(-) create mode 100644 arch/z16/src/z16f/z16f_serial.c diff --git a/arch/z16/src/z16f/Make.defs b/arch/z16/src/z16f/Make.defs index f360ca96d3..7edd0c257d 100644 --- a/arch/z16/src/z16f/Make.defs +++ b/arch/z16/src/z16f/Make.defs @@ -44,5 +44,5 @@ CMN_CSRCS = up_allocateheap.c up_initialize.c up_schedulesigaction.c \ up_exit.c up_releasestack.c up_idle.c up_reprioritizertr.c CHIP_SSRCS = z16f_lowuart.S -CHIP_CSRCS = z16f_clkinit.c z16f_irq.c z16f_timerisr.c +CHIP_CSRCS = z16f_clkinit.c z16f_irq.c z16f_timerisr.c z16f_serial.c diff --git a/arch/z16/src/z16f/chip.h b/arch/z16/src/z16f/chip.h index 2bea4d0752..3a1d3d172f 100644 --- a/arch/z16/src/z16f/chip.h +++ b/arch/z16/src/z16f/chip.h @@ -322,7 +322,24 @@ # define Z16F_GPIOK_SMRE _HX32(ffffe198) /* 8-bits: Port K Stop Mode Recovery En */ #endif -/* UART0/1 registers ****************************************************************/ +/* UART Register Offsets *************************************************************/ + +#define Z16F_UART_TXD _HX8(00) /* 8-bits: UART Transmit Data */ +#define Z16F_UART_RXD _HX8(00) /* 8-bits: UART Receive Data */ +#define Z16F_UART_STAT0 _HX8(01) /* 8-bits: UART Status 0 */ +#define Z16F_UART_CTL _HX8(02) /* 16-bits: UART Control */ +#define Z16F_UART_CTL0 _HX8(02) /* 8-bits: UART Control 0 */ +#define Z16F_UART_CTL1 _HX8(03) /* 8-bits: UART COntrol 1 */ +#define Z16F_UART_MDSTAT _HX8(04) /* 8-bits: UART Mode Select & Status */ +#define Z16F_UART_ADDR _HX8(05) /* 8-bits: UART Address Compare */ +#define Z16F_UART_BR _HX8(06) /* 16-bits: UART Baud Rate */ +#define Z16F_UART_BRH _HX8(06) /* 8-bits: UART Baud Rate High Byte */ +#define Z16F_UART_BRL _HX8(07) /* 8-bits: UART Baud Rate Low Byte */ + +#define Z16F_UART0_BASE _HX32(ffffe200) /* UART0 Register Base Address */ +#define Z16F_UART1_BASE _HX32(ffffe210) /* UART1 Register Base Address */ + +/* UART0/1 Registers ****************************************************************/ #define Z16F_UART0_TXD _HX32(ffffe200) /* 8-bits: UART0 Transmit Data */ #define Z16F_UART0_RXD _HX32(ffffe200) /* 8-bits: UART0 Receive Data */ @@ -348,6 +365,45 @@ #define Z16F_UART1_BRH _HX32(ffffe216) /* 8-bits: UART1 Baud Rate High Byte */ #define Z16F_UART1_BRL _HX32(ffffe217) /* 8-bits: UART1 Baud Rate Low Byte */ +/* UART0/1 Status 0 Register Bit Definitions ****************************************/ + +#define Z16F_UARTSTAT0_RDA _HX8(0x80) /* Bit 7: Receive Data Available */ +#define Z16F_UARTSTAT0_PE _HX8(0x40) /* Bit 6: Parity Error */ +#define Z16F_UARTSTAT0_OE _HX8(0x20) /* Bit 5: Overrun Error */ +#define Z16F_UARTSTAT0_FE _HX8(0x10) /* Bit 4: Framing Error */ +#define Z16F_UARTSTAT0_BRKD _HX8(0x08) /* Bit 3: Break Detect */ +#define Z16F_UARTSTAT0_TDRE _HX8(0x04) /* Bit 2: Transmitter Data Register Empty */ +#define Z16F_UARTSTAT0_TXE _HX8(0x02) /* Bit 1: Transmitter Empty */ +#define Z16F_UARTSTAT0_CTS _HX8(0x01) /* Bit 0: Clear To Send */ + +/* UART0/1 Control 0/1 Register Bit Definitions *************************************/ + +#define Z16F_UARTCTL0_TEN _HX8(0x80) /* Bit 7: Transmit Enable */ +#define Z16F_UARTCTL0_REN _HX8(0x40) /* Bit 6: Receive Enable */ +#define Z16F_UARTCTL0_CTSE _HX8(0x20) /* Bit 5: CTS Enable */ +#define Z16F_UARTCTL0_PEN _HX8(0x10) /* Bit 4: Parity Enable */ +#define Z16F_UARTCTL0_PSEL _HX8(0x08) /* Bit 3: Odd Parity Select */ +#define Z16F_UARTCTL0_SBRK _HX8(0x04) /* Bit 2: Send Break */ +#define Z16F_UARTCTL0_STOP _HX8(0x02) /* Bit 1: Stop Bit Select */ +#define Z16F_UARTCTL0_LBEN _HX8(0x01) /* Bit 0: Loopback Enable */ + +#define Z16F_UARTCTL1_MPMD1 _HX8(0x80) /* Bit 7: Multiprocessor Mode (bit1) */ +#define Z16F_UARTCTL1_MPEN _HX8(0x40) /* Bit 6: Multiprocessor Enable */ +#define Z16F_UARTCTL1_MPMD0 _HX8(0x20) /* Bit 5: Multiprocessor Mode (bit0) */ +#define Z16F_UARTCTL1_MPBT _HX8(0x10) /* Bit 4: Multiprocessor Bit Transmit */ +#define Z16F_UARTCTL1_DEPOL _HX8(0x08) /* Bit 3: Driver Enable Polarity */ +#define Z16F_UARTCTL1_BRGCTL _HX8(0x04) /* Bit 2: Baud Rate Generator Control */ +#define Z16F_UARTCTL1_RDAIRQ _HX8(0x02) /* Bit 1: Receive Data Interrupt Enable */ +#define Z16F_UARTCTL1_IREN _HX8(0x01) /* Bit 0: Infrared Encoder/Decoder Eanble */ + +/* UART0/1 Mode Status/Select Register Bit Definitions ******************************/ + +#define Z16F_UARTMDSEL_NORMAL _HX8(0x00) /* Bits 5-7=0: Multiprocessor and Normal Mode */ +#define Z16F_UARTMDSEL_FILTER _HX8(0x20) /* Bits 5-7=1: Noise Filter Control/Status */ +#define Z16F_UARTMDSEL_LINP _HX8(0x40) /* Bits 5-7=2: LIN protocol Contol/Status */ +#define Z16F_UARTMDSEL_HWREV _HX8(0xe0) /* Bits 5-7=7: LIN-UART Hardware Revision */ + /* Bits 0-4: Mode dependent status */ + /* Timer0/1/2 registers *************************************************************/ #define Z16F_TIMER0_HL _HX32(ffffe300) /* 16-bit: Timer 0 */ diff --git a/arch/z16/src/z16f/z16f_lowuart.S b/arch/z16/src/z16f/z16f_lowuart.S index 628dad4316..8123f99ab8 100755 --- a/arch/z16/src/z16f/z16f_lowuart.S +++ b/arch/z16/src/z16f/z16f_lowuart.S @@ -79,42 +79,55 @@ * Initialize UART0 or UART1 * * Parameters: - * r1 = 0:UART0 1:UART1 - * r2 = Frequency - * r3 = BAUD rate + * None * *************************************************************************/ z16f_lowuartinit: - pushmlo <r0,R3> /* Save registers */ + pushmlo <r0, r3> /* Save registers */ + + /* Calculate and set the baud rate generation register */ + - ld r3, #_SYS_CLK_FREQ - ld r0, R3 - sll r0, #3 #ifdef CONFIG_UART0_SERIAL_CONSOLE - sll r0, #CONFIG_UART0_BAUD + ld r3, #CONFIG_UART0_BAUD /* r3 = baud */ #else - sll r0, #CONFIG_UART1_BAUD + ld r3, #CONFIG_UART1_BAUD /* r3 = baud */ #endif - sll R3, #4 - udiv r0, R3 /* BRG = (freq + baud * 8)/(baud * 16) */ + ld r0, r3 /* r0 = baud */ + sll r0, #3 /* r0 = baud * 8 */ + add r0, #_SYS_CLK_FREQ /* r3 = freq + baud * 8*/ + sll r3, #4 /* r3 = baud * 16 */ + udiv r0, r3 /* BRG = (freq + baud * 8)/(baud * 16) */ #ifdef CONFIG_UART0_SERIAL_CONSOLE ld.w Z16F_UART0_BR, r0 /* Z16F_UART0_BR = BRG */ + + /* Set the GPIO Alternate Function Register Lo (AFL) register */ + ld r0, #%30 or.b Z16F_GPIOA_AFL, r0 /* Z16F_GPIOA_AFL |= %30 */ + + /* Enable UART receive (REN) and transmit (TEN) */ + clr.b Z16F_UART0_CTL1 /* Z16F_UART0_CTL1 = 0 */ - ld r0, #%c0 + ld r0, #(Z16F_UARTCTL0_TEN|Z16F_UARTCTL0_REN) ld.b Z16F_UART0_CTL0, r0 /* Z16F_UART0_CTL0 = %c0 */ #else ld.w Z16F_UART1_BR, r0 /* Z16F_UART1_BR = BRG */ + + /* Set the GPIO Alternate Function Register Lo (AFL) register */ + ld r0, #%30 or.b Z16F_GPIOD_AFL, r0 /* Z16F_GPIOD_AFL |= %30 */ + + /* Enable UART receive (REN) and transmit (TEN) */ + clr.b Z16F_UART1_CTL1 /* Z16F_UART1_CTL1 = 0 */ - ld r0, #%c0 + ld r0, #(Z16F_UARTCTL0_TEN|Z16F_UARTCTL0_REN) ld.b Z16F_UART1_CTL0, r0 /* Z16F_UART1_CTL0 = %c0 */ #endif - popmlo <r0, R3> /* Restore registers */ + popmlo <r0, r3> /* Restore registers */ ret /* Return */ @@ -131,22 +144,21 @@ z16f_lowuartinit: #ifdef CONFIG_ARCH_LOWPUTC _z16f_xmitc: - pushmlo <r0> /* Save registers */ + pushmlo <r0> /* Save registers */ _z16f_xmitc1: + ld r0, #Z16F_UARTSTAT0_TDRE /* TDRE=Transmitter Data Register Empty */ #ifdef CONFIG_UART0_SERIAL_CONSOLE - ld r0,#4 - tm.b Z16F_UART0_STAT0,r0 - jp eq, _z16f_xmitc1 /* While (!(Z16F_UART0_STAT0 & %4)) */ - ld.b Z16F_UART0_TXD,r1 /* Z16F_UART0_TXD = r1 (character) */ + tm.b Z16F_UART0_STAT0, r0 /* r0 = Z16F_UART0_STAT0 */ + jp eq, _z16f_xmitc1 /* While (!(Z16F_UART0_STAT0 & TDRE)) */ + ld.b Z16F_UART0_TXD, r1 /* Z16F_UART0_TXD = r1 (character) */ #else - ld r0,#4 - tm.b Z16F_UART1_STAT0,r0 - jp eq, _z16f_xmitc1 /* While (!(Z16F_UART1_STAT0 & %4)) */ - ld.b Z16F_UART1_TXD,r1 /* Z16F_UART1_TXD = r1 (character) */ + tm.b Z16F_UART1_STAT0, r0 /* r0 = Z16F_UART0_STAT1 */ + jp eq, _z16f_xmitc1 /* While (!(Z16F_UART1_STAT0 & TDRE)) */ + ld.b Z16F_UART1_TXD, r1 /* Z16F_UART1_TXD = r1 (character) */ #endif - popmlo <r0> /* Restore registers */ - ret /* Return */ + popmlo <r0> /* Restore registers */ + ret /* Return */ #endif /************************************************************************* @@ -200,13 +212,13 @@ _up_lowputc1: #ifdef CONFIG_ARCH_LOWGETC _up_lowgetc: up_lowgetc1: - ld r0, #%80 + ld r0, #Z16F_UARTSTAT0_RDA /* RDA=Receive data available */ #ifdef CONFIG_UART0_SERIAL_CONSOLE - tm.b Z16F_UART0_STAT0,r0 - jp eq, _up_lowgetc1 /* While (!Z16F_UART0_STAT0 & %80)) */ + tm.b Z16F_UART0_STAT0, r0 + jp eq, _up_lowgetc1 /* While (!Z16F_UART0_STAT0 & RDA)) */ ld.ub r0, Z16F_UART0_RXD /* r0 = Z16F_UART0_RXD */ #else - tm.b Z16F_UART1_STAT0,r0 /* While (!Z16F_UART1_STAT0 & %80) */ + tm.b Z16F_UART1_STAT0,r0 /* While (!Z16F_UART1_STAT0 & RDA) */ jp eq, _up_lowgetc1 ld.ub r0, Z16F_UART1_RXD /* r0 = Z16F_UART1_RXD */ #endif diff --git a/arch/z16/src/z16f/z16f_serial.c b/arch/z16/src/z16f/z16f_serial.c new file mode 100644 index 0000000000..6089a555c4 --- /dev/null +++ b/arch/z16/src/z16f/z16f_serial.c @@ -0,0 +1,701 @@ +/**************************************************************************** + * arch/z16/src/z16f/z16f_serial.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 <unistd.h> +#include <semaphore.h> +#include <string.h> +#include <errno.h> +#include <debug.h> + +#include <nuttx/irq.h> +#include <nuttx/arch.h> +#include <nuttx/serial.h> +#include <arch/serial.h> + +#include "up_arch.h" +#include "os_internal.h" +#include "up_internal.h" + +#if CONFIG_NFILE_DESCRIPTORS > 0 + +/**************************************************************************** + * Definitions + ****************************************************************************/ + +#define BASE_BAUD 115200 + +/* System clock frequency value from ZDS target settings */ + +extern _Erom unsigned long SYS_CLK_FREQ; +#define _DEFCLK ((unsigned long)&SYS_CLK_FREQ) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct z16f_uart_s +{ + uint32 uartbase; /* Base address of UART + * registers */ + uint32 baud; /* Configured baud */ + uint16 msr; /* Saved MSR value */ + ubyte irq; /* IRQ associated with + * this UART */ + ubyte parity; /* 0=none, 1=odd, 2=even */ + boolean stopbits2; /* TRUE: Configure with 2 + * stop bits instead of 1 */ +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int z16f_setup(struct uart_dev_s *dev); +static void z16f_shutdown(struct uart_dev_s *dev); +static int z16f_interrupt(int irq, void *context); +static int z16f_ioctl(struct file *filep, int cmd, unsigned long arg); +static int z16f_receive(struct uart_dev_s *dev, uint32 *status); +static void z16f_rxint(struct uart_dev_s *dev, boolean enable); +static boolean z16f_rxfifonotempty(struct uart_dev_s *dev); +static void z16f_send(struct uart_dev_s *dev, int ch); +static void z16f_txint(struct uart_dev_s *dev, boolean enable); +static boolean z16f_txfifonotfull(struct uart_dev_s *dev); +static boolean z16f_txfifoempty(struct uart_dev_s *dev); + +/**************************************************************************** + * Private Variables + ****************************************************************************/ + +struct uart_ops_s g_uart_ops = +{ + z16f_setup, /* setup */ + z16f_shutdown, /* shutdown */ + z16f_interrupt, /* handler */ + z16f_ioctl, /* ioctl */ + z16f_receive, /* receive */ + z16f_rxint, /* rxint */ + z16f_rxfifonotempty, /* rxfifonotempty */ + z16f_send, /* send */ + z16f_txint, /* txint */ + z16f_txfifonotfull, /* txfifonotfull */ + z16f_txfifoempty /* txfifoempty */ +}; + +/* I/O buffers */ + +static char g_uart0rxbuffer[CONFIG_UART0_RXBUFSIZE]; +static char g_uart0txbuffer[CONFIG_UART0_TXBUFSIZE]; +static char g_uart1rxbuffer[CONFIG_UART1_RXBUFSIZE]; +static char g_uart1txbuffer[CONFIG_UART1_TXBUFSIZE]; + +/* This describes the state of the DM320 uart0 port. */ + +static struct z16f_uart_s g_uart0priv = +{ + Z16F_UART0_BASE, /* uartbase */ + CONFIG_UART0_BAUD, /* baud */ + 0, /* msr */ + CONFIG_UART0_PARITY, /* parity */ + CONFIG_UART0_2STOP /* stopbits2 */ +}; + +static uart_dev_t g_uart0port = +{ + 0, /* open_count */ +/* REVISIT */ + Z16F_IRQ_UART0TX, /* txirq */ + Z16F_IRQ_UART0RX, /* rxirq */ + FALSE, /* xmitwaiting */ + FALSE, /* recvwaiting */ +#ifdef CONFIG_UART0_SERIAL_CONSOLE + TRUE, /* isconsole */ +#else + FALSE, /* isconsole */ +#endif + { 0 }, /* closesem */ + { 0 }, /* xmitsem */ + { 0 ], /* recvsem */ + { + { 0 }, /* xmit.sem */ + 0, /* xmit.head */ + 0, /* xmit.tail */ + CONFIG_UART0_TXBUFSIZE, /* xmit.size */ + g_uart0txbuffer, /* xmit.buffer */ + }, + { + { 0 }, /* recv.sem */ + 0, /* recv.head */ + 0, /* recv.tail */ + CONFIG_UART0_RXBUFSIZE, /* recv.size */ + g_uart0rxbuffer, /* recv.buffer */ + }, + &g_uart_ops, /* ops */ + &g_uart0priv, /* priv */ +}; + +/* This describes the state of the DM320 uart1 port. */ + +static struct z16f_uart_s g_uart1priv = +{ + Z16F_UART1_BASE, /* uartbase */ + CONFIG_UART1_BAUD, /* baud */ + 0, /* msr */ + CONFIG_UART1_PARITY, /* parity */ + CONFIG_UART1_2STOP /* stopbits2 */ +}; + +static uart_dev_t g_uart1port = +{ + 0, /* open_count */ +/* REVISIT */ + Z16F_IRQ_UART1TX, /* txirq */ + Z16F_IRQ_UART1RX, /* rxirq */ + FALSE, /* xmitwaiting */ + FALSE, /* recvwaiting */ +#ifdef CONFIG_UART0_SERIAL_CONSOLE + TRUE, /* isconsole */ +#else + FALSE, /* isconsole */ +#endif + { 0 }, /* closesem */ + { 0 }, /* xmitsem */ + { 0 ], /* recvsem */ + { + { 0 }, /* xmit.sem */ + 0, /* xmit.head */ + 0, /* xmit.tail */ + CONFIG_UART1_TXBUFSIZE, /* xmit.size */ + g_uart1txbuffer, /* xmit.buffer */ + }, + { + { 0 }, /* recv.sem */ + 0, /* recv.head */ + 0, /* recv.tail */ + CONFIG_UART0_RXBUFSIZE, /* recv.size */ + g_uart0rxbuffer, /* recv.buffer */ + }, + &g_uart_ops, /* ops */ + &g_uart1priv, /* priv */ +}; + +/* Now, which one with be tty0/console and which tty1? */ + +#ifdef CONFIG_UART1_SERIAL_CONSOLE +# define CONSOLE_DEV g_uart1port +# define TTYS0_DEV g_uart1port +# define TTYS1_DEV g_uart0port +#else +# define CONSOLE_DEV g_uart0port +# define TTYS0_DEV g_uart0port +# define TTYS1_DEV g_uart1port +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: z16f_serialout + ****************************************************************************/ + +static void z16f_serialout(struct z16f_uart_s *priv, int offset, ubyte value) +{ + putreg8(value, priv->uartbase + offset); +} + +/**************************************************************************** + * Name: z16f_disableuartirq + ****************************************************************************/ + +static ubyte z16f_disableuartirq(struct z16f_uart_s *priv) +{ +/* REVISIT */ + return 0; +} + +/**************************************************************************** + * Name: z16f_restoreuartirq + ****************************************************************************/ + +static void z16f_restoreuartirq(struct z16f_uart_s *priv, ubyte state) +{ +/* REVISIT */ +} + +/**************************************************************************** + * Name: z16f_waittrde + ****************************************************************************/ + +static void z16f_waittrde(struct z16f_uart_s *priv) +{ + int tmp; + + for (tmp = 1000 ; tmp > 0 ; tmp--) + { + if ((getreg8(priv->uartbase + Z16F_UART_STAT0) & Z16F_UARTSTAT0_TDRE) != 0) + { + break; + } + } +} + +/**************************************************************************** + * Name: z16f_setup + * + * Description: + * Configure the UART baud, parity, etc. This method is called the first + * time that the serial port is opened. + * + ****************************************************************************/ + +static int z16f_setup(struct uart_dev_s *dev) +{ +#ifdef CONFIG_SUPPRESS_UART_CONFIG + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; + uint32 brg; + ubyte ctl0; + ubyte ctl1; + + + /* Calculate and set the baud rate generation register. + * BRG = (freq + baud * 8)/(baud * 16) + */ + + brg = (_DEFCLK + (priv->baud << 3))/(priv->baud << 4); + putreg16((uint16)brg, priv->uartbase + Z16F_UART_BR); + + /* Configure STOP bits */ + + ctl0 = ctl1 = 0; + if (priv->stopbits2) + { + ctl0 |= Z16F_UARTCTL0_STOP; + } + + /* Configure parity */ + + if (priv->parity == 1) + { + ctl0 |= (Z16F_UARTCTL0_PEN|Z16F_UARTCTL0_PSEL); + } + else if (priv->parity == 2) + { + ctl0 |= Z16F_UARTCTL0_PEN; + } + + putreg8(ctl0, priv->uartbase + Z16F_UART_CTL0); + putreg8(ctl1, priv->uartbase + Z16F_UART_CTL1); + + /* Enable UART receive (REN) and transmit (TEN) */ + + ctl0 |= (Z16F_UARTCTL0_TEN|Z16F_UARTCTL0_REN); + putreg8(ctl0, priv->uartbase + Z16F_UART_CTL0); +#endif + return OK; +} + +/**************************************************************************** + * Name: z16f_shutdown + * + * Description: + * Disable the UART. This method is called when the serial + * port is closed + * + ****************************************************************************/ + +static void z16f_shutdown(struct uart_dev_s *dev) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; + (void)z16f_disableuartirq(priv); +} + +/**************************************************************************** + * Name: z16f_interrupt + * + * Description: + * This is the UART interrupt handler. It will be invoked + * when an interrupt received on the 'irq' It should call + * uart_transmitchars or uart_receivechar to perform the + * appropriate data transfers. The interrupt handling logic\ + * must be able to map the 'irq' number into the approprite + * uart_dev_s structure in order to call these functions. + * + ****************************************************************************/ + +static int z16f_interrupt(int irq, void *context) +{ + struct uart_dev_s *dev = NULL; + struct z16f_uart_s *priv; + ubyte status; + int passes; + +/* REVISIT */ + +#if 0 + if (g_uart1port.txirq == irq || g_uart1port.rxirq == irq) + { + dev = &g_uart1port; + } + else if (g_uart0port.txirq == irq || g_uart0port.rxirq == irq) + { + dev = &g_uart0port; + } + else +#endif + { + PANIC(OSERR_INTERNAL); + } + + priv = (struct z16f_uart_s*)dev->priv; + + /* Loop while there is something to do */ + + for (;;) + { + /* Get the current UART status */ + + status = getreg8(priv->uartbase + Z16F_UART_STAT0); + if ((status & (Z16F_UARTSTAT0_RDA|Z16F_UARTSTAT0_TDRE)) == 0) + { + break; + } + else + { + /* Handline incoming, receive bytes */ + + if (status & Z16F_UARTSTAT0_RDA) + { + uart_recvchars(dev); + } + + /* Handle outgoing, transmit bytes */ + + if (status & Z16F_UARTSTAT0_TDRE) + { + uart_xmitchars(dev); + } + + /* Keep track of how many times we do this in case there + * is some hardware failure condition. + */ + + if (++passes > 256) + { + break; + } + } + } +} + +/**************************************************************************** + * Name: z16f_ioctl + * + * Description: + * All ioctl calls will be routed through this method + * + ****************************************************************************/ + +static int z16f_ioctl(struct file *filep, int cmd, unsigned long arg) +{ + *get_errno_ptr() = ENOTTY; + return ERROR; +} + +/**************************************************************************** + * Name: z16f_receive + * + * Description: + * Called (usually) from the interrupt level to receive one character from + * the UART. Error bits associated with the receipt are provided in the + * return 'status'. + * + ****************************************************************************/ + +static int z16f_receive(struct uart_dev_s *dev, uint32 *status) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; + ubyte rxd; + ubyte stat0; + + rxd = getreg8(priv->uartbase + Z16F_UART_RXD); + stat0 = getreg8(priv->uartbase + Z16F_UART_STAT0); + *status = (uint32)rxd | (((uint32)stat0) << 8); + return rxd; +} + +/**************************************************************************** + * Name: z16f_rxint + * + * Description: + * Call to enable or disable RX interrupts + * + ****************************************************************************/ + +static void z16f_rxint(struct uart_dev_s *dev, boolean enable) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; +/* REVISIT */ +#if 0 + if (enable) + { +#ifndef CONFIG_SUPPRESS_SERIAL_INTS + up_enable_irq(priv->rxirq); +#endif + } + else + { + up_disable_irq(priv->rxirq); + } +#endif +} + +/**************************************************************************** + * Name: z16f_rxfifonotempty + * + * Description: + * Return TRUE if the receive fifo is not empty + * + ****************************************************************************/ + +static boolean z16f_rxfifonotempty(struct uart_dev_s *dev) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; + return ((getreg8(priv->uartbase + Z16F_UART_STAT0) & Z16F_UARTSTAT0_RDA) != 0); +} + +/**************************************************************************** + * Name: z16f_send + * + * Description: + * This method will send one byte on the UART + * + ****************************************************************************/ + +static void z16f_send(struct uart_dev_s *dev, int ch) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; + putreg8(ch, priv->uartbase + Z16F_UART1_TXD); +} + +/**************************************************************************** + * Name: z16f_txint + * + * Description: + * Call to enable or disable TX interrupts + * + ****************************************************************************/ + +static void z16f_txint(struct uart_dev_s *dev, boolean enable) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; +/* REVISIT */ +#if 0 + if (enable) + { +#ifndef CONFIG_SUPPRESS_SERIAL_INTS + up_enable_irq(priv->txirq); +#endif + } + else + { + up_disable_irq(priv->txirq); + } +#endif +} + +/**************************************************************************** + * Name: z16f_txfifonotfull + * + * Description: + * Return TRUE if the tranmsit fifo is not full + * + ****************************************************************************/ + +static boolean z16f_txfifonotfull(struct uart_dev_s *dev) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; + return ((getreg8(priv->uartbase + Z16F_UART_STAT0) & Z16F_UARTSTAT0_TDRE) != 0); +} + +/**************************************************************************** + * Name: z16f_txfifoempty + * + * Description: + * Return TRUE if the transmit fifo is empty + * + ****************************************************************************/ + +static boolean z16f_txfifoempty(struct uart_dev_s *dev) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv; + return ((getreg8(priv->uartbase + Z16F_UART_STAT0) & Z16F_UARTSTAT0_TXE) != 0); +} + +/**************************************************************************** + * Public Funtions + ****************************************************************************/ + +/**************************************************************************** + * Name: z16f_serialinit + * + * Description: + * Performs the low level UART initialization early in + * debug so that the serial console will be available + * during bootup. This must be called before z16f_serialinit. + * + ****************************************************************************/ + +void up_earlyserialinit(void) +{ + (void)z16f_disableuartirq(TTYS0_DEV.priv); + (void)z16f_disableuartirq(TTYS1_DEV.priv); + + CONSOLE_DEV.isconsole = TRUE; + z16f_setup(&CONSOLE_DEV); +} + +/**************************************************************************** + * Name: z16f_serialinit + * + * Description: + * Register serial console and serial ports. This assumes + * that up_earlyserialinit was called previously. + * + ****************************************************************************/ + +void z16f_serialinit(void) +{ + (void)uart_register("/dev/console", &CONSOLE_DEV); + (void)uart_register("/dev/ttyS0", &TTYS0_DEV); + (void)uart_register("/dev/ttyS1", &TTYS1_DEV); +} + +/**************************************************************************** + * Name: up_putc + * + * Description: + * Provide priority, low-level access to support OS debug + * writes + * + ****************************************************************************/ + +int up_putc(int ch) +{ + struct z16f_uart_s *priv = (struct z16f_uart_s*)CONSOLE_DEV.priv; + ubyte state; + + state = z16f_disableuartirq(priv); + z16f_waittrde(priv); + z16f_serialout(priv, UART_DTRR, (uint16)ch); + + /* Check for LF */ + + if (ch == '\n') + { + /* Add CR */ + + z16f_waittrde(priv); + z16f_serialout(priv, UART_DTRR, '\r'); + } + + z16f_waittrde(priv); + z16f_restoreuartirq(priv, state); + return ch; +} + +#else /* CONFIG_NFILE_DESCRIPTORS > 0 */ + +/**************************************************************************** + * Definitions + ****************************************************************************/ + +#ifdef CONFIG_UART1_SERIAL_CONSOLE +# define z16f_contrde() \ + do { \ + int tmp; \ + for (tmp = 1000 ; tmp > 0 ; tmp--) \ + if ((getreg8(Z16F_UART1_STAT0) & Z16F_UARTSTAT0_TDRE) != 0) \ + break; \ + } while (0) +# define z16f_contxd(ch) \ + putreg8((ubyte)(ch), Z16F_UART1_STAT0) +#else +# define z16f_contrde() \ + do { \ + int tmp; \ + for (tmp = 1000 ; tmp > 0 ; tmp--) \ + if ((getreg8(Z16F_UART0_STAT0) & Z16F_UARTSTAT0_TDRE) != 0) \ + break; \ + } while (0) +# define z16f_contxd(ch) \ + putreg8((ubyte)(ch), Z16F_UART0_STAT0) +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +int up_putc(int ch) +{ + z16f_contrde(); + z16f_contxd(ch); + + /* Check for LF */ + + if (ch == '\n') + { + /* Add CR */ + + z16f_contrde(); + z16f_contxd('\r'); + } + + return ch; +} + +#endif /* CONFIG_NFILE_DESCRIPTORS > 0 */ + + diff --git a/configs/z16f2800100zcog/ostest/defconfig b/configs/z16f2800100zcog/ostest/defconfig index bba24c16ec..20a1799df5 100644 --- a/configs/z16f2800100zcog/ostest/defconfig +++ b/configs/z16f2800100zcog/ostest/defconfig @@ -70,10 +70,9 @@ CONFIG_DRAM_SIZE=65536 # This specific the size of the receive buffer # CONFIG_UARTn_TXBUFSIZE - Characters are buffered before # being sent. This specific the size of the transmit buffer -# CONFIG_UARTn_BAUD - The configure BAUD of the UART. Must be -# CONFIG_UARTn_BITS - The number of bits. Must be either 7 or 8. +# CONFIG_UARTn_BAUD - The configure BAUD of the UART. # CONFIG_UARTn_PARTIY - 0=no parity, 1=odd parity, 2=even parity -# CONFIG_UARTn_2STOP - Two stop bits +# CONFIG_UARTn_2STOP - 0=1 stop bit; 1=Two stop bits # CONFIG_UART0_SERIAL_CONSOLE=y CONFIG_UART1_SERIAL_CONSOLE=n @@ -83,8 +82,6 @@ CONFIG_UART0_RXBUFSIZE=256 CONFIG_UART1_RXBUFSIZE=256 CONFIG_UART0_BAUD=115200 CONFIG_UART1_BAUD=115200 -CONFIG_UART0_BITS=8 -CONFIG_UART1_BITS=8 CONFIG_UART0_PARITY=0 CONFIG_UART1_PARITY=0 CONFIG_UART0_2STOP=0 diff --git a/configs/z16f2800100zcog/src/z16f_lowinit.c b/configs/z16f2800100zcog/src/z16f_lowinit.c index 02ee9daf61..439e9069e5 100644 --- a/configs/z16f2800100zcog/src/z16f_lowinit.c +++ b/configs/z16f2800100zcog/src/z16f_lowinit.c @@ -73,6 +73,11 @@ static void z16f_gpioinit(void) /* Configure Direction switch port */ putreg8(getreg8(Z16F_GPIOC_DD) | 0x01, Z16F_GPIOC_DD); + + /* Configure to use both UART0 and 1 */ + + putreg8(getreg8(Z16F_GPIOA_AFL) | 0x30, Z16F_GPIOA_AFL); + putreg8(getreg8(Z16F_GPIOD_AFL) | 0x30, Z16F_GPIOD_AFL); } /*************************************************************************** diff --git a/include/nuttx/serial.h b/include/nuttx/serial.h index 7719fca6b4..9651d73807 100644 --- a/include/nuttx/serial.h +++ b/include/nuttx/serial.h @@ -1,7 +1,7 @@ /************************************************************************************ * serial.h * - * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <spudmonkey@racsa.co.cr> * * Redistribution and use in source and binary forms, with or without @@ -14,7 +14,7 @@ * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. - * 3. Neither the name Gregory Nutt nor the names of its contributors may be + * 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. * -- GitLab