cons.c revision 1.2
1/* $NetBSD: cons.c,v 1.2 2014/03/26 17:47:10 christos Exp $ */ 2 3/*- 4 * Copyright (c) 2005 NONAKA Kimihiro 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29#include <lib/libsa/stand.h> 30#include <lib/libkern/libkern.h> 31 32#include <sys/bootblock.h> 33 34#include "boot.h" 35#include "cons.h" 36 37#ifndef CONSPEED 38#define CONSPEED 9600 39#endif 40 41#define POLL_FREQ 10 42 43extern struct landisk_boot_params boot_params; 44 45static int consdev = CONSDEV_BIOSCONS; 46 47/*ARGSUSED*/ 48int 49cninit(int dev) 50{ 51 52 switch (dev) { 53 default: 54 case CONSDEV_BIOSCONS: 55 break; 56 57 case CONSDEV_SCIF: 58 switch (boot_params.bp_conspeed) { 59 default: 60 scif_init(CONSPEED); 61 break; 62 63 case 9600: 64#if 0 65 case 19200: 66 case 38400: 67 case 57600: 68 case 115200: 69#endif 70 scif_init(boot_params.bp_conspeed); 71 break; 72 } 73 break; 74 } 75 consdev = dev; 76 77 return (0); 78} 79 80int 81getchar(void) 82{ 83 84 switch (consdev) { 85 default: 86 case CONSDEV_BIOSCONS: 87 return bioscons_getc(); 88 89 case CONSDEV_SCIF: 90 return scif_getc(); 91 } 92} 93 94void 95putchar(int c) 96{ 97 98 switch (consdev) { 99 default: 100 case CONSDEV_BIOSCONS: 101 bioscons_putc(c); 102 break; 103 104 case CONSDEV_SCIF: 105 if (c == '\n') 106 scif_putc('\r'); 107 scif_putc(c); 108 break; 109 } 110} 111 112/*ARGSUSED*/ 113int 114iskey(int intr) 115{ 116 117 switch (consdev) { 118 default: 119 case CONSDEV_BIOSCONS: 120 return scif_status2(); 121 122 case CONSDEV_SCIF: 123 return scif_status(); 124 } 125} 126 127char 128awaitkey(int timeout, int tell) 129{ 130 int i; 131 char c = 0; 132 133 i = timeout * POLL_FREQ; 134 135 for (;;) { 136 if (tell && (i % POLL_FREQ) == 0) { 137 char numbuf[20]; 138 int len, j; 139 140 len = snprintf(numbuf, sizeof(numbuf), 141 "%d ", i / POLL_FREQ); 142 for (j = 0; j < len; j++) 143 numbuf[len + j] = '\b'; 144 numbuf[len + j] = '\0'; 145 printf(numbuf); 146 } 147 if (iskey(1)) { 148 /* flush input buffer */ 149 while (iskey(0)) 150 c = getchar(); 151 if (c == 0) 152 c = -1; 153 goto out; 154 } 155 if (i--) { 156 delay(1000 / POLL_FREQ); 157 } else { 158 break; 159 } 160 } 161 162out: 163 if (tell) 164 printf("0 \n"); 165 166 return (c); 167} 168