Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/sommerfeld_i386mp_1]: src/sys/arch/i386/stand/lib Add some comments to m...
details: https://anonhg.NetBSD.org/src/rev/7a964af3b4aa
branches: sommerfeld_i386mp_1
changeset: 482497:7a964af3b4aa
user: thorpej <thorpej%NetBSD.org@localhost>
date: Tue Feb 19 20:18:37 2002 +0000
description:
Add some comments to make some #if/#else/#endif's more clear.
diffstat:
sys/arch/i386/stand/lib/pcio.c | 331 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 331 insertions(+), 0 deletions(-)
diffs (truncated from 335 to 300 lines):
diff -r ff66ddde410d -r 7a964af3b4aa sys/arch/i386/stand/lib/pcio.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/i386/stand/lib/pcio.c Tue Feb 19 20:18:37 2002 +0000
@@ -0,0 +1,331 @@
+/* $NetBSD: pcio.c,v 1.11.2.2 2002/02/19 20:18:37 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1996, 1997
+ * Matthias Drochner. All rights reserved.
+ *
+ * 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 for the NetBSD Project
+ * by Matthias Drochner.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *
+ */
+
+/*
+ * console I/O
+ * needs lowlevel routines from conio.S and comio.S
+ */
+
+#include <lib/libsa/stand.h>
+#include <lib/libkern/libkern.h>
+
+#include "libi386.h"
+#include "bootinfo.h"
+
+extern void conputc __P((int));
+extern int congetc __P((void));
+extern int coniskey __P((void));
+
+struct btinfo_console btinfo_console;
+
+#ifdef SUPPORT_SERIAL
+static int iodev;
+
+#ifdef DIRECT_SERIAL
+#include "comio_direct.h"
+
+#define cominit cominit_d
+#define computc computc_d
+#define comgetc comgetc_d
+/* comstatus() is different */
+
+#define SERIAL_ARG btinfo_console.addr
+#else
+extern void cominit __P((int));
+extern int computc __P((int, int));
+extern int comgetc __P((int));
+extern int comstatus __P((int));
+
+#define SERIAL_ARG (iodev - CONSDEV_COM0)
+#endif /* DIRECT_SERIAL */
+
+static int getcomaddr __P((int));
+#endif /* SUPPORT_SERIAL */
+
+#define POLL_FREQ 10
+
+#ifdef SUPPORT_SERIAL
+static int
+getcomaddr(idx)
+ int idx;
+{
+ short addr;
+ /* read in BIOS data area */
+ pvbcopy((void *)(0x400 + 2 * idx), &addr, 2);
+ return(addr);
+}
+#endif
+
+void
+initio(dev)
+ int dev;
+{
+#ifdef SUPPORT_SERIAL
+ int i;
+
+ switch (dev) {
+ case CONSDEV_AUTO:
+ for(i = 0; i < 3; i++) {
+ iodev = CONSDEV_COM0 + i;
+ btinfo_console.addr = getcomaddr(i);
+ if(!btinfo_console.addr) break;
+ conputc('0' + i); /* to tell user what happens */
+ cominit(SERIAL_ARG);
+#ifdef DIRECT_SERIAL
+ /* check for:
+ * 1. successful output
+ * 2. optionally, keypress within 1s
+ */
+ if ( computc(':', SERIAL_ARG) &&
+ computc('-', SERIAL_ARG) &&
+ computc('(', SERIAL_ARG)
+#ifdef COMCONS_KEYPRESS
+ && awaitkey(7, 0)
+#endif
+ )
+ goto ok;
+#else /* ! DIRECT_SERIAL */
+ /*
+ * serial console must have hardware handshake!
+ * check:
+ * 1. character output without error
+ * 2. status bits for modem ready set
+ * (status seems only useful after character output)
+ * 3. optionally, keypress within 1s
+ */
+ if (!(computc('@', SERIAL_ARG) & 0x80)
+ && (comstatus(SERIAL_ARG) & 0x00b0)
+#ifdef COMCONS_KEYPRESS
+ && awaitkey(7, 0)
+#endif
+ )
+ goto ok;
+#endif /* DIRECT_SERIAL */
+ }
+ iodev = CONSDEV_PC;
+ok:
+ break;
+ case CONSDEV_COM0:
+ case CONSDEV_COM1:
+ case CONSDEV_COM2:
+ case CONSDEV_COM3:
+ iodev = dev;
+ btinfo_console.addr = getcomaddr(iodev - CONSDEV_COM0);
+ if(!btinfo_console.addr) goto nocom;
+ cominit(SERIAL_ARG);
+ break;
+ case CONSDEV_COM0KBD:
+ case CONSDEV_COM1KBD:
+ case CONSDEV_COM2KBD:
+ case CONSDEV_COM3KBD:
+ iodev = dev - 4;
+ i = iodev - CONSDEV_COM0;
+ btinfo_console.addr = getcomaddr(i);
+ if(!btinfo_console.addr) goto nocom;
+ conputc('0' + i); /* to tell user what happens */
+ cominit(SERIAL_ARG);
+#ifdef DIRECT_SERIAL
+ /* check for:
+ * 1. successful output
+ * 2. optionally, keypress within 1s
+ */
+ if ( computc(':', SERIAL_ARG) &&
+ computc('-', SERIAL_ARG) &&
+ computc('(', SERIAL_ARG)
+#ifdef COMCONS_KEYPRESS
+ && awaitkey(7, 0)
+#endif
+ )
+ break;
+#else /* ! DIRECT_SERIAL */
+ /*
+ * serial console must have hardware handshake!
+ * check:
+ * 1. character output without error
+ * 2. status bits for modem ready set
+ * (status seems only useful after character output)
+ * 3. optionally, keypress within 1s
+ */
+ if (!(computc('@', SERIAL_ARG) & 0x80)
+ && (comstatus(SERIAL_ARG) & 0x00b0)
+#ifdef COMCONS_KEYPRESS
+ && awaitkey(7, 0)
+#endif
+ )
+ break;
+#endif /* DIRECT_SERIAL */
+ default:
+nocom:
+ iodev = CONSDEV_PC;
+ break;
+ }
+ conputc('\015');
+ conputc('\n');
+ strncpy(btinfo_console.devname, iodev == CONSDEV_PC ? "pc" : "com", 16);
+#if defined(DIRECT_SERIAL) && defined(CONSPEED)
+ btinfo_console.speed = CONSPEED;
+#else
+ btinfo_console.speed = 9600;
+#endif
+#else /* !SUPPORT_SERIAL */
+ strncpy(btinfo_console.devname, "pc", 16);
+#endif /* SUPPORT_SERIAL */
+}
+
+static inline void internal_putchar __P((int));
+
+static inline void
+internal_putchar(c)
+ int c;
+{
+#ifdef SUPPORT_SERIAL
+ switch (iodev) {
+ case CONSDEV_PC:
+#endif
+ conputc(c);
+#ifdef SUPPORT_SERIAL
+ break;
+ case CONSDEV_COM0:
+ case CONSDEV_COM1:
+ case CONSDEV_COM2:
+ case CONSDEV_COM3:
+ computc(c, SERIAL_ARG);
+ break;
+ }
+#endif
+}
+
+void
+putchar(c)
+ int c;
+{
+ if (c == '\n')
+ internal_putchar('\r');
+ internal_putchar(c);
+}
+
+int
+getchar()
+{
+#ifdef SUPPORT_SERIAL
+ int c;
+ switch (iodev) {
+ default: /* to make gcc -Wall happy... */
+ case CONSDEV_PC:
+#endif
+ return (congetc());
+#ifdef SUPPORT_SERIAL
+ case CONSDEV_COM0:
+ case CONSDEV_COM1:
+ case CONSDEV_COM2:
+ case CONSDEV_COM3:
+#ifdef DIRECT_SERIAL
+ c = comgetc(SERIAL_ARG);
+#else
+ do {
+ c = comgetc(SERIAL_ARG);
+ } while ((c >> 8) == 0xe0); /* catch timeout */
+#ifdef COMDEBUG
+ if (c & 0x8000) {
+ printf("com input %x, status %x\n",
+ c, comstatus(SERIAL_ARG));
+ }
+#endif
+ c &= 0xff;
+#endif /* DIRECT_SERIAL */
+ return (c);
+ }
+#endif /* SUPPORT_SERIAL */
+}
+
+int
+iskey()
+{
+#ifdef SUPPORT_SERIAL
+ switch (iodev) {
+ default: /* to make gcc -Wall happy... */
+ case CONSDEV_PC:
+#endif
+ return (coniskey());
+#ifdef SUPPORT_SERIAL
+ case CONSDEV_COM0:
+ case CONSDEV_COM1:
+ case CONSDEV_COM2:
+ case CONSDEV_COM3:
+#ifdef DIRECT_SERIAL
+ return(!!comstatus_d(SERIAL_ARG));
+#else
+ return (!!(comstatus(SERIAL_ARG) & 0x0100));
+#endif
+ }
+#endif /* SUPPORT_SERIAL */
+}
+
+char
+awaitkey(timeout, tell)
Home |
Main Index |
Thread Index |
Old Index