Home | History | Annotate | Line # | Download | only in boot
      1 /*	$NetBSD: consio.c,v 1.17 2017/05/22 16:59:32 ragge Exp $ */
      2 /*
      3  * Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27  /* All bugs are subject to removal without further notice */
     28 
     29 
     30 
     31 #include "sys/param.h"
     32 
     33 #include "../vax/gencons.h"
     34 
     35 #include "mtpr.h"
     36 #include "sid.h"
     37 #include "rpb.h"
     38 #include "ka630.h"
     39 
     40 #include "data.h"
     41 
     42 void setup(void);
     43 
     44 static void (*put_fp)(int)  = NULL;
     45 static int (*get_fp)(void) = NULL;
     46 static int (*test_fp)(void) = NULL;
     47 
     48 void pr_putchar(int c);	/* putchar() using mtpr/mfpr */
     49 int pr_getchar(void);
     50 int pr_testchar(void);
     51 
     52 void rom_putchar(int c);	/* putchar() using ROM routines */
     53 int rom_getchar(void);
     54 int rom_testchar(void);
     55 
     56 int rom_putc;		/* ROM-address of put-routine */
     57 int rom_getc;		/* ROM-address of get-routine */
     58 
     59 /* Pointer to KA630 console page, initialized by ka630_consinit */
     60 unsigned char  *ka630_conspage;
     61 
     62 /* Function that initializes things for KA630 ROM console I/O */
     63 void ka630_consinit(void);
     64 
     65 /* Functions that use KA630 ROM for console I/O */
     66 void ka630_rom_putchar(int c);
     67 int ka630_rom_getchar(void);
     68 int ka630_rom_testchar(void);
     69 
     70 /* Also added such a thing for KA53 - MK-991208 */
     71 unsigned char  *ka53_conspage;
     72 void ka53_consinit(void);
     73 
     74 void ka53_rom_putchar(int c);
     75 int ka53_rom_getchar(void);
     76 int ka53_rom_testchar(void);
     77 
     78 void vxt_putchar(int c);
     79 int vxt_getchar(void);
     80 int vxt_testchar(void);
     81 
     82 void putchar(int);
     83 int getchar(void);
     84 int testkey(void);
     85 void consinit(void);
     86 void _rtt(void);
     87 
     88 void
     89 putchar(int c)
     90 {
     91 	(*put_fp)(c);
     92 	if (c == 10)
     93 		(*put_fp)(13);		/* CR/LF */
     94 }
     95 
     96 int
     97 getchar(void)
     98 {
     99 	int c;
    100 
    101 	do
    102 		c = (*get_fp)() & 0177;
    103 	while (c == 17 || c == 19);		/* ignore XON/XOFF */
    104 	if (c < 96 && c > 64)
    105 		c += 32;
    106 	return c;
    107 }
    108 
    109 int
    110 testkey(void)
    111 {
    112 	return (*test_fp)();
    113 }
    114 
    115 /*
    116  * setup() is called out of the startup files (start.s, srt0.s) and
    117  * initializes data which are globally used and is called before main().
    118  */
    119 void
    120 consinit(void)
    121 {
    122 	put_fp = pr_putchar; /* Default */
    123 	get_fp = pr_getchar;
    124 	test_fp = pr_testchar;
    125 
    126 	/*
    127 	 * According to the vax_boardtype (vax_cputype is not specific
    128 	 * enough to do that) we decide which method/routines to use
    129 	 * for console I/O.
    130 	 * mtpr/mfpr are restricted to serial consoles, ROM-based routines
    131 	 * support both serial and graphical consoles.
    132 	 * We default to mtpr routines; so that we don't crash if
    133 	 * it isn't a supported system.
    134 	 */
    135 	switch (vax_boardtype) {
    136 
    137 	case VAX_BTYP_43:
    138 	case VAX_BTYP_410:
    139 	case VAX_BTYP_420:
    140 		put_fp = rom_putchar;
    141 		get_fp = rom_getchar;
    142 		test_fp = rom_testchar;
    143 		rom_putc = 0x20040058;		/* 537133144 */
    144 		rom_getc = 0x20040044;		/* 537133124 */
    145 		break;
    146 
    147 	case VAX_BTYP_VXT:
    148 		put_fp = vxt_putchar;
    149 		get_fp = vxt_getchar;
    150 		test_fp = vxt_testchar;
    151 		break;
    152 
    153 	case VAX_BTYP_630:
    154 		ka630_consinit();
    155 		break;
    156 
    157 	case VAX_BTYP_46:
    158 	case VAX_BTYP_48:
    159 	case VAX_BTYP_49:
    160 		put_fp = rom_putchar;
    161 		get_fp = rom_getchar;
    162 		test_fp = rom_testchar;
    163 		rom_putc = 0x20040068;
    164 		rom_getc = 0x20040054;
    165 		break;
    166 
    167 	case VAX_BTYP_53:
    168 		ka53_consinit();
    169 		break;
    170 
    171 #ifdef notdef
    172 	case VAX_BTYP_630:
    173 	case VAX_BTYP_650:
    174 	case VAX_BTYP_9CC:
    175 	case VAX_BTYP_60:
    176 		put_fp = pr_putchar;
    177 		get_fp = pr_getchar;
    178 		break
    179 #endif
    180 	}
    181 	return;
    182 }
    183 
    184 /*
    185  * putchar() using MTPR
    186  */
    187 void
    188 pr_putchar(int c)
    189 {
    190 	int	timeout = 1<<15;	/* don't hang the machine! */
    191 
    192 	/*
    193 	 * On KA88 we may get C-S/C-Q from the console.
    194 	 * Must obey it.
    195 	 */
    196 	while (mfpr(PR_RXCS) & GC_DON) {
    197 		if ((mfpr(PR_RXDB) & 0x7f) == 19) {
    198 			while (1) {
    199 				while ((mfpr(PR_RXCS) & GC_DON) == 0)
    200 					;
    201 				if ((mfpr(PR_RXDB) & 0x7f) == 17)
    202 					break;
    203 			}
    204 		}
    205 	}
    206 
    207 	while ((mfpr(PR_TXCS) & GC_RDY) == 0)  /* Wait until xmit ready */
    208 		if (--timeout < 0)
    209 			break;
    210 	mtpr(c, PR_TXDB);		/* xmit character */
    211 }
    212 
    213 /*
    214  * getchar() using MFPR
    215  */
    216 int
    217 pr_getchar(void)
    218 {
    219 	while ((mfpr(PR_RXCS) & GC_DON) == 0)
    220 		;	/* wait for char */
    221 	return (mfpr(PR_RXDB));			/* now get it */
    222 }
    223 
    224 int
    225 pr_testchar(void)
    226 {
    227 	if (mfpr(PR_RXCS) & GC_DON)
    228 		return mfpr(PR_RXDB);
    229 	else
    230 		return 0;
    231 }
    232 
    233 /*
    234  * void ka630_rom_getchar (void)  ==> initialize KA630 ROM console I/O
    235  */
    236 void ka630_consinit(void)
    237 {
    238 	short *NVR;
    239 	int i;
    240 
    241 	/* Find the console page */
    242 	NVR = (short *) KA630_NVR_ADRS;
    243 
    244 	i = *NVR++ & 0xFF;
    245 	i |= (*NVR++ & 0xFF) << 8;
    246 	i |= (*NVR++ & 0xFF) << 16;
    247 	i |= (*NVR++ & 0xFF) << 24;
    248 
    249 	ka630_conspage = (unsigned char *) i;
    250 
    251 	/* Go to last row to minimize confusion */
    252 	ka630_conspage[KA630_ROW] = ka630_conspage[KA630_MAXROW];
    253 	ka630_conspage[KA630_COL] = ka630_conspage[KA630_MINCOL];
    254 
    255 	/* Use KA630 ROM console I/O routines */
    256 	put_fp = ka630_rom_putchar;
    257 	get_fp = ka630_rom_getchar;
    258 	test_fp = ka630_rom_testchar;
    259 }
    260 
    261 
    262 /*
    263  * void ka53_consinit (void)  ==> initialize KA53 ROM console I/O
    264  */
    265 void ka53_consinit(void)
    266 {
    267 	ka53_conspage = (unsigned char *) 0x2014044b;
    268 
    269 	put_fp = ka53_rom_putchar;
    270 	get_fp = ka53_rom_getchar;
    271 	test_fp = ka53_rom_testchar;
    272 }
    273 
    274 static volatile int *vxtregs = (int *)0x200A0000;
    275 
    276 #define	CH_SR		1
    277 #define	CH_DAT		3
    278 #define SR_TX_RDY	0x04
    279 #define SR_RX_RDY	0x01
    280 
    281 void
    282 vxt_putchar(int c)
    283 {
    284 	while ((vxtregs[CH_SR] & SR_TX_RDY) == 0)
    285 		;
    286 	vxtregs[CH_DAT] = c;
    287 }
    288 
    289 int
    290 vxt_getchar(void)
    291 {
    292 	while ((vxtregs[CH_SR] & SR_RX_RDY) == 0)
    293 		;
    294 	return vxtregs[CH_DAT];
    295 }
    296 
    297 int
    298 vxt_testchar(void)
    299 {
    300 	if ((vxtregs[CH_SR] & SR_RX_RDY) == 0)
    301 		return 0;
    302 	return vxtregs[CH_DAT];
    303 }
    304