1 /*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1990, 1993
4 * The Regents of the University of California. 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 *
12 * from: Utah $Hdr: ite_dv.c 1.10 93/06/25$
13 *
14 * @(#)ite_dv.c 8.1 (Berkeley) 07/08/93
15 */
16
17 #include "ite.h"
18 #if NITE > 0
19
20 #include <sys/param.h>
21 #include <sys/conf.h>
22 #include <sys/proc.h>
23 #include <sys/ioctl.h>
24 #include <sys/tty.h>
25 #include <sys/systm.h>
26
27 #include <hp/dev/itevar.h>
28 #include <hp/dev/itereg.h>
29 #include <hp300/dev/grf_dvreg.h>
30
31 #include <machine/cpu.h>
32
33 /* XXX */
34 #include <hp/dev/grfioctl.h>
35 #include <hp/dev/grfvar.h>
36
37 #define REGBASE ((struct dvboxfb *)(ip->regbase))
38 #define WINDOWMOVER dvbox_windowmove
39
dvbox_init(ip)40 dvbox_init(ip)
41 register struct ite_softc *ip;
42 {
43 int i;
44
45 /* XXX */
46 if (ip->regbase == 0) {
47 struct grf_softc *gp = ip->grf;
48
49 ip->regbase = gp->g_regkva;
50 ip->fbbase = gp->g_fbkva;
51 ip->fbwidth = gp->g_display.gd_fbwidth;
52 ip->fbheight = gp->g_display.gd_fbheight;
53 ip->dwidth = gp->g_display.gd_dwidth;
54 ip->dheight = gp->g_display.gd_dheight;
55 /*
56 * XXX some displays (e.g. the davinci) appear
57 * to return a display height greater than the
58 * returned FB height. Guess we should go back
59 * to getting the display dimensions from the
60 * fontrom...
61 */
62 if (ip->dwidth > ip->fbwidth)
63 ip->dwidth = ip->fbwidth;
64 if (ip->dheight > ip->fbheight)
65 ip->dheight = ip->fbheight;
66 }
67
68 dv_reset(ip->regbase);
69
70 /*
71 * Turn on frame buffer, turn on overlay planes, set replacement
72 * rule, enable top overlay plane writes for ite, disable all frame
73 * buffer planes, set byte per pixel, and display frame buffer 0.
74 * Lastly, turn on the box.
75 */
76 REGBASE->interrupt = 0x04;
77 REGBASE->drive = 0x10;
78 REGBASE->rep_rule = RR_COPY << 4 | RR_COPY;
79 REGBASE->opwen = 0x01;
80 REGBASE->fbwen = 0x0;
81 REGBASE->fold = 0x01;
82 REGBASE->vdrive = 0x0;
83 REGBASE->dispen = 0x01;
84
85 /*
86 * Video enable top overlay plane.
87 */
88 REGBASE->opvenp = 0x01;
89 REGBASE->opvens = 0x01;
90
91 /*
92 * Make sure that overlay planes override frame buffer planes.
93 */
94 REGBASE->ovly0p = 0x0;
95 REGBASE->ovly0s = 0x0;
96 REGBASE->ovly1p = 0x0;
97 REGBASE->ovly1s = 0x0;
98 REGBASE->fv_trig = 0x1;
99 DELAY(100);
100
101 /*
102 * Setup the overlay colormaps. Need to set the 0,1 (black/white)
103 * color for both banks.
104 */
105
106 for (i = 0; i <= 1; i++) {
107 REGBASE->cmapbank = i;
108 REGBASE->rgb[0].red = 0x00;
109 REGBASE->rgb[0].green = 0x00;
110 REGBASE->rgb[0].blue = 0x00;
111 REGBASE->rgb[1].red = 0xFF;
112 REGBASE->rgb[1].green = 0xFF;
113 REGBASE->rgb[1].blue = 0xFF;
114 }
115 REGBASE->cmapbank = 0;
116
117 db_waitbusy(ip->regbase);
118
119 ite_fontinfo(ip);
120 ite_fontinit(ip);
121
122 /*
123 * Clear the (visible) framebuffer.
124 */
125 dvbox_windowmove(ip, 0, 0, 0, 0, ip->dheight, ip->dwidth, RR_CLEAR);
126 db_waitbusy(ip->regbase);
127
128 /*
129 * Stash the inverted cursor.
130 */
131 dvbox_windowmove(ip, charY(ip, ' '), charX(ip, ' '),
132 ip->cblanky, ip->cblankx, ip->ftheight,
133 ip->ftwidth, RR_COPYINVERTED);
134 }
135
dvbox_deinit(ip)136 dvbox_deinit(ip)
137 register struct ite_softc *ip;
138 {
139 dvbox_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
140 db_waitbusy(ip->regbase);
141
142 ip->flags &= ~ITE_INITED;
143 }
144
dvbox_putc(ip,c,dy,dx,mode)145 dvbox_putc(ip, c, dy, dx, mode)
146 register struct ite_softc *ip;
147 register int dy, dx;
148 int c, mode;
149 {
150 register int wrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY);
151
152 dvbox_windowmove(ip, charY(ip, c), charX(ip, c),
153 dy * ip->ftheight, dx * ip->ftwidth,
154 ip->ftheight, ip->ftwidth, wrr);
155 }
156
dvbox_cursor(ip,flag)157 dvbox_cursor(ip, flag)
158 register struct ite_softc *ip;
159 register int flag;
160 {
161 if (flag == DRAW_CURSOR)
162 draw_cursor(ip)
163 else if (flag == MOVE_CURSOR) {
164 erase_cursor(ip)
165 draw_cursor(ip)
166 }
167 else
168 erase_cursor(ip)
169 }
170
171 dvbox_clear(ip, sy, sx, h, w)
172 struct ite_softc *ip;
173 register int sy, sx, h, w;
174 {
175 dvbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
176 sy * ip->ftheight, sx * ip->ftwidth,
177 h * ip->ftheight, w * ip->ftwidth,
178 RR_CLEAR);
179 }
180
dvbox_scroll(ip,sy,sx,count,dir)181 dvbox_scroll(ip, sy, sx, count, dir)
182 register struct ite_softc *ip;
183 register int sy, count;
184 int dir, sx;
185 {
186 register int dy;
187 register int dx = sx;
188 register int height = 1;
189 register int width = ip->cols;
190
191 if (dir == SCROLL_UP) {
192 dy = sy - count;
193 height = ip->rows - sy;
194 }
195 else if (dir == SCROLL_DOWN) {
196 dy = sy + count;
197 height = ip->rows - dy - 1;
198 }
199 else if (dir == SCROLL_RIGHT) {
200 dy = sy;
201 dx = sx + count;
202 width = ip->cols - dx;
203 }
204 else {
205 dy = sy;
206 dx = sx - count;
207 width = ip->cols - sx;
208 }
209
210 dvbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
211 dy * ip->ftheight, dx * ip->ftwidth,
212 height * ip->ftheight,
213 width * ip->ftwidth, RR_COPY);
214 }
215
216 dvbox_windowmove(ip, sy, sx, dy, dx, h, w, func)
217 struct ite_softc *ip;
218 int sy, sx, dy, dx, h, w, func;
219 {
220 register struct dvboxfb *dp = REGBASE;
221 if (h == 0 || w == 0)
222 return;
223
224 db_waitbusy(ip->regbase);
225 dp->rep_rule = func << 4 | func;
226 dp->source_y = sy;
227 dp->source_x = sx;
228 dp->dest_y = dy;
229 dp->dest_x = dx;
230 dp->wheight = h;
231 dp->wwidth = w;
232 dp->wmove = 1;
233 }
234 #endif
235