xref: /netbsd-src/sys/arch/mvme68k/stand/sboot/console.c (revision beb929a933428e8d2836408d67f695b164e8ceaa)
1*beb929a9Schuck /*	$NetBSD: console.c,v 1.7 2011/02/02 17:53:41 chuck Exp $	*/
2015e898cSperry 
30b036e11Schuck /*
40b036e11Schuck  * Copyright (c) 1995 Charles D. Cranor and Seth Widoff
50b036e11Schuck  * All rights reserved.
60b036e11Schuck  *
70b036e11Schuck  * Redistribution and use in source and binary forms, with or without
80b036e11Schuck  * modification, are permitted provided that the following conditions
90b036e11Schuck  * are met:
100b036e11Schuck  * 1. Redistributions of source code must retain the above copyright
110b036e11Schuck  *    notice, this list of conditions and the following disclaimer.
120b036e11Schuck  * 2. Redistributions in binary form must reproduce the above copyright
130b036e11Schuck  *    notice, this list of conditions and the following disclaimer in the
140b036e11Schuck  *    documentation and/or other materials provided with the distribution.
150b036e11Schuck  *
160b036e11Schuck  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
170b036e11Schuck  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
180b036e11Schuck  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
190b036e11Schuck  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
200b036e11Schuck  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
210b036e11Schuck  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
220b036e11Schuck  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
230b036e11Schuck  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
240b036e11Schuck  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
250b036e11Schuck  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260b036e11Schuck  */
270b036e11Schuck /*
280b036e11Schuck  * console i/o
290b036e11Schuck  */
300b036e11Schuck 
310b036e11Schuck #include "sboot.h"
320b036e11Schuck 
330b036e11Schuck /*
340b036e11Schuck  * hardware
350b036e11Schuck  */
360b036e11Schuck 
370b036e11Schuck struct zs_hw {
380b036e11Schuck 	volatile u_char ctl;
390b036e11Schuck 	volatile u_char data;
400b036e11Schuck };
410b036e11Schuck 
420b036e11Schuck struct zs_hw *zs =  (struct zs_hw *)CONS_ZS_ADDR;
430b036e11Schuck 
440b036e11Schuck /*
450b036e11Schuck  * consinit: init console
460b036e11Schuck  */
470b036e11Schuck 
48921705c3Sjdolecek void
consinit(void)49a07f7c80Stsutsui consinit(void)
500b036e11Schuck {
51a84a6744Sscw 	int mark = time();
52a84a6744Sscw 	int rr1;
53a07f7c80Stsutsui 	for (;;) {
540b036e11Schuck 		if (time() > mark + 5) break;
550b036e11Schuck 		zs->ctl = 1; rr1 = zs->ctl;
560b036e11Schuck 		zs->ctl = 0;
57a07f7c80Stsutsui 		if ((rr1 & 0x1) == 1 && (zs->ctl & 0x4) == 4)
58a07f7c80Stsutsui 			break; /* zs_drain! */
590b036e11Schuck 	}
60a07f7c80Stsutsui 	zs->ctl =  9;
61a07f7c80Stsutsui 	zs->ctl = 0x00; /* clear interrupt */
62a07f7c80Stsutsui 	zs->ctl =  4;
63a07f7c80Stsutsui 	zs->ctl = 0x44; /* 16x clk, 1 stop bit */
64a07f7c80Stsutsui 	zs->ctl =  5;
65a07f7c80Stsutsui 	zs->ctl = 0xea; /* DTR on, 8 bit xmit, xmit on, RTS on */
66a07f7c80Stsutsui 	zs->ctl =  3;
67a07f7c80Stsutsui 	zs->ctl = 0xc1; /* 8 bit recv, auto cd_cts, recv on */
68a07f7c80Stsutsui 	zs->ctl =  1;
69a07f7c80Stsutsui 	zs->ctl = 0x00; /* no intrs */
70a07f7c80Stsutsui 	zs->ctl =  2;
71a07f7c80Stsutsui 	zs->ctl = 0x00; /* no vector */
72a07f7c80Stsutsui 	zs->ctl = 10;
73a07f7c80Stsutsui 	zs->ctl = 0x00; /* */
74a07f7c80Stsutsui 	zs->ctl = 11;
75a07f7c80Stsutsui 	zs->ctl = 0x50; /* clocking options */
76a07f7c80Stsutsui 	zs->ctl = 12;
77a07f7c80Stsutsui 	zs->ctl = 0x0e; /* 9600 baud, part 1 */
78a07f7c80Stsutsui 	zs->ctl = 13;
79a07f7c80Stsutsui 	zs->ctl = 0x00; /* 9600 baud, part 2 */
80a07f7c80Stsutsui 	zs->ctl = 14;
81a07f7c80Stsutsui 	zs->ctl = 0x03; /* more clocking options */
82a07f7c80Stsutsui 	zs->ctl = 15;
83a07f7c80Stsutsui 	zs->ctl = 0x00; /* clear intrs */
840b036e11Schuck }
850b036e11Schuck 
860b036e11Schuck /*
870b036e11Schuck  * putchar: put char to console
880b036e11Schuck  */
890b036e11Schuck 
putchar(int c)90921705c3Sjdolecek void putchar(int c)
910b036e11Schuck {
92a07f7c80Stsutsui 	if (c == '\n')
93a07f7c80Stsutsui 		putchar('\r');	/* avoid the need for \r\n in printf */
940b036e11Schuck 	zs->ctl = 0;
950b036e11Schuck 	while ((zs->ctl & 0x04) == 0) {
960b036e11Schuck 		zs->ctl = 0;
970b036e11Schuck 	}
980b036e11Schuck 	zs->ctl = 8;
99921705c3Sjdolecek 	zs->ctl = (char)c;
1000b036e11Schuck }
1010b036e11Schuck 
1020b036e11Schuck /*
1030b036e11Schuck  * cngetc: get 1 char from console
1040b036e11Schuck  */
1050b036e11Schuck 
cngetc(void)106a07f7c80Stsutsui char cngetc(void)
1070b036e11Schuck {
108a07f7c80Stsutsui 
1090b036e11Schuck 	zs->ctl = 0;
1100b036e11Schuck 	while ((zs->ctl & 0x1) == 0) {
1110b036e11Schuck 		zs->ctl = 0;
1120b036e11Schuck 	}
1130b036e11Schuck 	zs->ctl = 8;
1140b036e11Schuck 	return zs->ctl;
1150b036e11Schuck }
1160b036e11Schuck 
1170b036e11Schuck /*
1180b036e11Schuck  * puts: put string to console
1190b036e11Schuck  */
1200b036e11Schuck 
121a07f7c80Stsutsui void
puts(char * str)122a07f7c80Stsutsui puts(char *str)
1230b036e11Schuck {
124a07f7c80Stsutsui 
1250b036e11Schuck 	while (*str != '\0') {
1260b036e11Schuck 		putchar(*str);
1270b036e11Schuck 		str++;
1280b036e11Schuck 	}
1290b036e11Schuck }
1300b036e11Schuck 
1310b036e11Schuck /*
1320b036e11Schuck  * ngets: get string from console
1330b036e11Schuck  */
1340b036e11Schuck 
135a07f7c80Stsutsui char *
ngets(char * str,int size)136a07f7c80Stsutsui ngets(char *str, int size)
1370b036e11Schuck {
138a07f7c80Stsutsui 
1390b036e11Schuck 	int i = 0;
1400b036e11Schuck 	while ((i < size - 1) && (str[i] = cngetc()) != '\r') {
1410b036e11Schuck 		if (str[i] == '\b' || str[i] == 0x7F) {
142a07f7c80Stsutsui 			if (i == 0)
143a07f7c80Stsutsui 				continue;
1440b036e11Schuck 			i--;
1450b036e11Schuck 			puts("\b \b");
1460b036e11Schuck 			continue;
1470b036e11Schuck 		}
1480b036e11Schuck 		putchar(str[i]);
1490b036e11Schuck 		i++;
1500b036e11Schuck 	}
1510b036e11Schuck 	puts("\n");
1520b036e11Schuck 	str[i] = '\0';
153a07f7c80Stsutsui 	return &str[i];
1540b036e11Schuck }
155