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