/* $NetBSD: cons.c,v 1.2 2014/03/26 17:47:10 christos Exp $ */ /*- * Copyright (c) 2005 NONAKA Kimihiro * 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. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. */ #include #include #include #include "boot.h" #include "cons.h" #ifndef CONSPEED #define CONSPEED 9600 #endif #define POLL_FREQ 10 extern struct landisk_boot_params boot_params; static int consdev = CONSDEV_BIOSCONS; /*ARGSUSED*/ int cninit(int dev) { switch (dev) { default: case CONSDEV_BIOSCONS: break; case CONSDEV_SCIF: switch (boot_params.bp_conspeed) { default: scif_init(CONSPEED); break; case 9600: #if 0 case 19200: case 38400: case 57600: case 115200: #endif scif_init(boot_params.bp_conspeed); break; } break; } consdev = dev; return (0); } int getchar(void) { switch (consdev) { default: case CONSDEV_BIOSCONS: return bioscons_getc(); case CONSDEV_SCIF: return scif_getc(); } } void putchar(int c) { switch (consdev) { default: case CONSDEV_BIOSCONS: bioscons_putc(c); break; case CONSDEV_SCIF: if (c == '\n') scif_putc('\r'); scif_putc(c); break; } } /*ARGSUSED*/ int iskey(int intr) { switch (consdev) { default: case CONSDEV_BIOSCONS: return scif_status2(); case CONSDEV_SCIF: return scif_status(); } } char awaitkey(int timeout, int tell) { int i; char c = 0; i = timeout * POLL_FREQ; for (;;) { if (tell && (i % POLL_FREQ) == 0) { char numbuf[20]; int len, j; len = snprintf(numbuf, sizeof(numbuf), "%d ", i / POLL_FREQ); for (j = 0; j < len; j++) numbuf[len + j] = '\b'; numbuf[len + j] = '\0'; printf(numbuf); } if (iskey(1)) { /* flush input buffer */ while (iskey(0)) c = getchar(); if (c == 0) c = -1; goto out; } if (i--) { delay(1000 / POLL_FREQ); } else { break; } } out: if (tell) printf("0 \n"); return (c); }