xref: /csrg-svn/sys/hp300/stand/dcm.c (revision 42379)
1*42379Smckusick /*
2*42379Smckusick  * Copyright (c) 1988 University of Utah.
3*42379Smckusick  * Copyright (c) 1990 The Regents of the University of California.
4*42379Smckusick  * All rights reserved.
5*42379Smckusick  *
6*42379Smckusick  * This code is derived from software contributed to Berkeley by
7*42379Smckusick  * the Systems Programming Group of the University of Utah Computer
8*42379Smckusick  * Science Department.
9*42379Smckusick  *
10*42379Smckusick  * %sccs.include.redist.c%
11*42379Smckusick  *
12*42379Smckusick  *	@(#)dcm.c	7.1 (Berkeley) 05/25/90
13*42379Smckusick  */
14*42379Smckusick 
15*42379Smckusick #ifdef DCMCONSOLE
16*42379Smckusick #include "param.h"
17*42379Smckusick #include "machine/cons.h"
18*42379Smckusick #include "../hpdev/device.h"
19*42379Smckusick #include "../hpdev/dcmreg.h"
20*42379Smckusick 
21*42379Smckusick #define CONSPORT	(1)
22*42379Smckusick struct dcmdevice *CONSOLE = NULL;
23*42379Smckusick 
24*42379Smckusick dcmprobe(cp)
25*42379Smckusick 	struct consdev *cp;
26*42379Smckusick {
27*42379Smckusick 	extern struct hp_hw sc_table[];
28*42379Smckusick 	register struct hp_hw *hw;
29*42379Smckusick 	register struct dcmdevice *dcm;
30*42379Smckusick 
31*42379Smckusick 	for (hw = sc_table; hw < &sc_table[MAX_CTLR]; hw++)
32*42379Smckusick 	        if (hw->hw_type == COMMDCM && !badaddr((caddr_t)hw->hw_addr))
33*42379Smckusick 			break;
34*42379Smckusick 	if (hw->hw_type != COMMDCM) {
35*42379Smckusick 		cp->cn_pri = CN_DEAD;
36*42379Smckusick 		return;
37*42379Smckusick 	}
38*42379Smckusick 	CONSOLE = (struct dcmdevice *)hw->hw_addr;
39*42379Smckusick 
40*42379Smckusick 	dcm = CONSOLE;
41*42379Smckusick 	switch (dcm->dcm_rsid) {
42*42379Smckusick 	case DCMID:
43*42379Smckusick 		cp->cn_pri = CN_NORMAL;
44*42379Smckusick 		break;
45*42379Smckusick 	case DCMID|DCMCON:
46*42379Smckusick 		cp->cn_pri = CN_REMOTE;
47*42379Smckusick 		break;
48*42379Smckusick 	default:
49*42379Smckusick 		cp->cn_pri = CN_DEAD;
50*42379Smckusick 		break;
51*42379Smckusick 	}
52*42379Smckusick }
53*42379Smckusick 
54*42379Smckusick dcminit(cp)
55*42379Smckusick 	struct consdev *cp;
56*42379Smckusick {
57*42379Smckusick 	register struct dcmdevice *dcm = CONSOLE;
58*42379Smckusick 	register int port = CONSPORT;
59*42379Smckusick 
60*42379Smckusick 	dcm->dcm_ic = IC_ID;
61*42379Smckusick 	while (dcm->dcm_thead[port].ptr != dcm->dcm_ttail[port].ptr)
62*42379Smckusick 		;
63*42379Smckusick 	dcm->dcm_data[port].dcm_baud = BR_9600;
64*42379Smckusick 	dcm->dcm_data[port].dcm_conf = LC_8BITS | LC_1STOP;
65*42379Smckusick 	SEM_LOCK(dcm);
66*42379Smckusick 	dcm->dcm_cmdtab[port].dcm_data |= CT_CON;
67*42379Smckusick 	dcm->dcm_cr |= (1 << port);
68*42379Smckusick 	SEM_UNLOCK(dcm);
69*42379Smckusick 	DELAY(15000);
70*42379Smckusick }
71*42379Smckusick 
72*42379Smckusick #ifndef SMALL
73*42379Smckusick dcmgetchar()
74*42379Smckusick {
75*42379Smckusick 	register struct dcmdevice *dcm = CONSOLE;
76*42379Smckusick 	register struct dcmrfifo *fifo;
77*42379Smckusick 	register struct dcmpreg *pp;
78*42379Smckusick 	register unsigned head;
79*42379Smckusick 	int c, stat, port;
80*42379Smckusick 
81*42379Smckusick 	port = CONSPORT;
82*42379Smckusick 	pp = dcm_preg(dcm, port);
83*42379Smckusick 	head = pp->r_head & RX_MASK;
84*42379Smckusick 	if (head == (pp->r_tail & RX_MASK))
85*42379Smckusick 		return(0);
86*42379Smckusick 	fifo = &dcm->dcm_rfifos[3-port][head>>1];
87*42379Smckusick 	c = fifo->data_char;
88*42379Smckusick 	stat = fifo->data_stat;
89*42379Smckusick 	pp->r_head = (head + 2) & RX_MASK;
90*42379Smckusick 	SEM_LOCK(dcm);
91*42379Smckusick 	stat = dcm->dcm_iir;
92*42379Smckusick 	SEM_UNLOCK(dcm);
93*42379Smckusick 	return(c);
94*42379Smckusick }
95*42379Smckusick #else
96*42379Smckusick dcmgetchar()
97*42379Smckusick {
98*42379Smckusick 	return(0);
99*42379Smckusick }
100*42379Smckusick #endif
101*42379Smckusick 
102*42379Smckusick dcmputchar(c)
103*42379Smckusick 	register int c;
104*42379Smckusick {
105*42379Smckusick 	register struct dcmdevice *dcm = CONSOLE;
106*42379Smckusick 	register struct dcmpreg *pp;
107*42379Smckusick 	register int timo;
108*42379Smckusick 	unsigned tail;
109*42379Smckusick 	int port, stat;
110*42379Smckusick 
111*42379Smckusick 	port = CONSPORT;
112*42379Smckusick 	pp = dcm_preg(dcm, port);
113*42379Smckusick 	tail = pp->t_tail & TX_MASK;
114*42379Smckusick 	timo = 50000;
115*42379Smckusick 	while (tail != (pp->t_head & TX_MASK) && --timo)
116*42379Smckusick 		;
117*42379Smckusick 	dcm->dcm_tfifos[3-port][tail].data_char = c;
118*42379Smckusick 	pp->t_tail = tail = (tail + 1) & TX_MASK;
119*42379Smckusick 	SEM_LOCK(dcm);
120*42379Smckusick 	dcm->dcm_cmdtab[port].dcm_data |= CT_TX;
121*42379Smckusick 	dcm->dcm_cr |= (1 << port);
122*42379Smckusick 	SEM_UNLOCK(dcm);
123*42379Smckusick 	timo = 1000000;
124*42379Smckusick 	while (tail != (pp->t_head & TX_MASK) && --timo)
125*42379Smckusick 		;
126*42379Smckusick 	SEM_LOCK(dcm);
127*42379Smckusick 	stat = dcm->dcm_iir;
128*42379Smckusick 	SEM_UNLOCK(dcm);
129*42379Smckusick }
130*42379Smckusick #endif
131