Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sgimips/dev Support for the SCC serial ports on Ind...



details:   https://anonhg.NetBSD.org/src/rev/21440dfe1436
branches:  trunk
changeset: 509712:21440dfe1436
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Fri May 11 04:24:44 2001 +0000

description:
Support for the SCC serial ports on Indigo2/Indy.

>From Rafal K. Boni.

diffstat:

 sys/arch/sgimips/dev/zs.c      |  744 +++++++++++++++++++++++++++++++++++++++++
 sys/arch/sgimips/dev/zs_kgdb.c |  309 +++++++++++++++++
 2 files changed, 1053 insertions(+), 0 deletions(-)

diffs (truncated from 1061 to 300 lines):

diff -r ad497d82fc1f -r 21440dfe1436 sys/arch/sgimips/dev/zs.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/sgimips/dev/zs.c Fri May 11 04:24:44 2001 +0000
@@ -0,0 +1,744 @@
+/*     $NetBSD: zs.c,v 1.1 2001/05/11 04:24:44 thorpej Exp $   */
+
+/*-
+ * Copyright (c) 1996, 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Gordon W. Ross and Wayne Knowles
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+/*
+ * Zilog Z8530 Dual UART driver (machine-dependent part)
+ *
+ * Runs two serial lines per chip using slave drivers.
+ * Plain tty/async lines use the zs_async slave.
+ */
+
+/* 
+ * Short TODO list:
+ *     (1) KGDB support.
+ */
+
+#include "opt_ddb.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/kernel.h>
+#include <sys/proc.h>
+#include <sys/tty.h>
+#include <sys/time.h>
+#include <sys/syslog.h>
+
+#include <machine/cpu.h>
+#include <machine/arcs.h>
+#include <machine/intr.h>
+#include <machine/autoconf.h>
+#include <machine/z8530var.h>
+
+#include <dev/cons.h>
+#include <dev/ic/z8530reg.h>
+
+#include <sgimips/hpc/hpcvar.h>
+#include <sgimips/hpc/hpcreg.h>
+
+/*
+ * Some warts needed by z8530tty.c -
+ * The default parity REALLY needs to be the same as the PROM uses,
+ * or you can not see messages done with printf during boot-up...
+ */
+int zs_def_cflag = (CREAD | CS8 | HUPCL);
+int zs_major = 35;
+
+#define PCLK           3672000  /* PCLK pin input clock rate */
+
+#ifndef ZS_DEFSPEED
+#define ZS_DEFSPEED    9600
+#endif
+
+/*
+ * Define interrupt levels.
+ */
+#define ZSHARD_PRI 64
+
+/* SGI shouldn't need ZS_DELAY() as recovery time is done in hardware? */
+#define ZS_DELAY()     delay(3)
+
+/* The layout of this is hardware-dependent (padding, order). */
+struct zschan {
+       u_char   pad1[3];
+       volatile u_char zc_csr;         /* ctrl,status, and indirect access */
+       u_char   pad2[3];
+       volatile u_char zc_data;        /* data */
+};
+
+struct zsdevice {
+       struct  zschan zs_chan_b;
+       struct  zschan zs_chan_a;
+};
+
+/* Return the byte offset of element within a structure */
+#define OFFSET(struct_def, el)         ((size_t)&((struct_def *)0)->el)
+
+#define ZS_CHAN_A      OFFSET(struct zsdevice, zs_chan_a)
+#define ZS_CHAN_B      OFFSET(struct zsdevice, zs_chan_b)
+#define ZS_REG_CSR     0
+#define ZS_REG_DATA    1
+static int zs_chan_offset[] = {ZS_CHAN_A, ZS_CHAN_B};
+
+static void zscnprobe __P((struct consdev *));
+static void zscninit __P((struct consdev *));
+static int  zscngetc __P((dev_t));
+static void zscnputc __P((dev_t, int));
+static void zscnpollc __P((dev_t, int));
+
+static int  cons_port;
+
+struct consdev zs_cn = {
+       zscnprobe,
+       zscninit,
+       zscngetc,
+       zscnputc,
+       zscnpollc
+};
+
+/* Flags from cninit() */
+static int zs_consunit = -1;
+static int zs_conschan = -1;
+
+/* Default speed for all channels */
+static int zs_defspeed = ZS_DEFSPEED;
+static volatile int zssoftpending;
+
+static u_char zs_init_reg[16] = {
+       0,                              /* 0: CMD (reset, etc.) */
+       0,                              /* 1: No interrupts yet. */
+       ZSHARD_PRI,                     /* 2: IVECT */
+       ZSWR3_RX_8 | ZSWR3_RX_ENABLE,
+       ZSWR4_CLK_X16 | ZSWR4_ONESB,
+       ZSWR5_TX_8 | ZSWR5_TX_ENABLE,
+       0,                              /* 6: TXSYNC/SYNCLO */
+       0,                              /* 7: RXSYNC/SYNCHI */
+       0,                              /* 8: alias for data port */
+       ZSWR9_MASTER_IE,
+       0,                              /*10: Misc. TX/RX control bits */
+       ZSWR11_TXCLK_BAUD | ZSWR11_RXCLK_BAUD | ZSWR11_TRXC_OUT_ENA,
+       BPS_TO_TCONST(PCLK/16, ZS_DEFSPEED), /*12: BAUDLO (default=9600) */
+       0,                              /*13: BAUDHI (default=9600) */
+       ZSWR14_BAUD_ENA | ZSWR14_BAUD_FROM_PCLK,
+       ZSWR15_BREAK_IE,
+};
+
+
+/****************************************************************
+ * Autoconfig
+ ****************************************************************/
+
+/* Definition of the driver for autoconfig. */
+static int     zs_hpc_match __P((struct device *, struct cfdata *, void *));
+static void    zs_hpc_attach __P((struct device *, struct device *, void *));
+static int     zs_print __P((void *, const char *name));
+
+struct cfattach zsc_hpc_ca = {
+       sizeof(struct zsc_softc), zs_hpc_match, zs_hpc_attach
+};
+
+extern struct  cfdriver zsc_cd;
+
+static int     zshard __P((void *));
+void           zssoft __P((void *));
+static int     zs_get_speed __P((struct zs_chanstate *));
+struct         zschan *zs_get_chan_addr (int zs_unit, int channel);
+int            zs_getc __P((void *));
+void           zs_putc __P((void *, int));
+
+/*
+ * Is the zs chip present?
+ */
+static int
+zs_hpc_match(parent, cf, aux)
+       struct device *parent;
+       struct cfdata *cf;
+       void *aux;
+{
+       return 1;
+}
+
+/*
+ * Attach a found zs.
+ *
+ * Match slave number to zs unit number, so that misconfiguration will
+ * not set up the keyboard as ttya, etc.
+ */
+static void
+zs_hpc_attach(parent, self, aux)
+       struct device *parent;
+       struct device *self;
+       void *aux;
+{
+       struct zsc_softc *zsc = (void *) self;
+       struct hpc_attach_args *haa = aux;
+       struct zsc_attach_args zsc_args;
+       struct zs_chanstate *cs;
+       struct zs_channel *ch;
+       int    zs_unit, channel, err, s;
+       char  *promconsdev;
+
+       promconsdev = ARCS->GetEnvironmentVariable("console");
+
+       zsc->zsc_bustag = haa->ha_iot;
+       if ((err = bus_space_subregion(haa->ha_iot, haa->ha_ioh,
+                                      HPC_PBUS_CH6_DEVREGS + 0x30, 0x10, 
+                                      &zsc->zsc_base)) != 0) {
+               printf(": unable to map 85c30 registers, error = %d\n", err);
+               return;
+       }
+
+       zs_unit = zsc->zsc_dev.dv_unit;
+       printf("\n");
+
+       /*
+        * Initialize software state for each channel.  
+        * 
+        * Done in reverse order of channels since the first serial port
+        * is actually attached to the *second* channel, and vice versa.
+        * Doing it this way should force a 'zstty*' to attach zstty0 to
+        * channel 1 and zstty1 to channel 0.  They couldn't have wired
+        * it up in a more sensible fashion, could they?
+        */
+       for (channel = 1; channel >= 0; channel--) {
+               zsc_args.channel = channel;
+               ch = &zsc->zsc_cs_store[channel];
+               cs = zsc->zsc_cs[channel] = (struct zs_chanstate *)ch;
+
+               cs->cs_reg_csr = NULL;
+               cs->cs_reg_data = NULL;
+               cs->cs_channel = channel;
+               cs->cs_private = NULL;
+               cs->cs_ops = &zsops_null;
+               cs->cs_brg_clk = PCLK / 16;
+
+               if (bus_space_subregion(zsc->zsc_bustag, zsc->zsc_base,
+                                       zs_chan_offset[channel],
+                                       sizeof(struct zschan),
+                                       &ch->cs_regs) != 0) {
+                       printf(": cannot map regs\n");
+                       return;
+               }
+               ch->cs_bustag = zsc->zsc_bustag;
+
+               bcopy(zs_init_reg, cs->cs_creg, 16);
+               bcopy(zs_init_reg, cs->cs_preg, 16);
+
+               zsc_args.hwflags = 0;
+               zsc_args.consdev = NULL;
+
+               if (zs_consunit == -1 && zs_conschan == -1) {
+                   /* 
+                    * If this channel is being used by the PROM console,
+                    * pass the generic zs driver a 'no reset' flag so the
+                    * channel gets left in the appropriate state after
+                    * attach.
+                    * 
+                    * Note that the funky wiring means 'd2' == channel 0
+                    * and 'd' == channel 1 (though you might expect other-
+                    * wise).
+                    */
+                   if (promconsdev != NULL && promconsdev[0] == 'd') {
+                       if (promconsdev[1] == '2' && channel == 0)
+                           zsc_args.hwflags |= ZS_HWFLAG_NORESET;
+
+                       if (promconsdev[1] == '\0' && channel == 1)
+                           zsc_args.hwflags |= ZS_HWFLAG_NORESET;
+                   }
+               }
+
+               /* If console, don't stomp speed, let zstty know */
+               if (zs_unit == zs_consunit && channel == zs_conschan) {
+                       zsc_args.consdev = &zs_cn;
+                       zsc_args.hwflags = ZS_HWFLAG_CONSOLE;
+
+                       cs->cs_defspeed = zs_get_speed(cs);
+               } else
+                       cs->cs_defspeed = zs_defspeed;
+



Home | Main Index | Thread Index | Old Index