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