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