|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990,1989 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * File: bt459.c
28: * Author: Alessandro Forin, Carnegie Mellon University
29: * Date: 9/90
30: *
31: * Routines for the bt459 RAMDAC
32: */
33:
34: #include <platforms.h>
35:
36: #include <chips/bt459.h>
37: #include <chips/screen.h>
38:
39: #ifdef DECSTATION
40:
41: typedef struct {
42: volatile unsigned char addr_lo;
43: char pad0[3];
44: volatile unsigned char addr_hi;
45: char pad1[3];
46: volatile unsigned char addr_reg;
47: char pad2[3];
48: volatile unsigned char addr_cmap;
49: char pad3[3];
50: } bt459_ds_padded_regmap_t;
51: #define bt459_padded_regmap_t bt459_ds_padded_regmap_t
52:
53: #define mb() /* no write/read reordering problems */
54:
55: #endif /* DECSTATION */
56:
57: #ifdef FLAMINGO
58:
59: /* Sparse space ! */
60: typedef struct {
61: volatile unsigned int addr_lo;
62: int pad0;
63: volatile unsigned int addr_hi;
64: int pad1;
65: volatile unsigned int addr_reg;
66: int pad2;
67: volatile unsigned int addr_cmap;
68: int pad3;
69: } bt459_fl_padded_regmap_t;
70: #define bt459_padded_regmap_t bt459_fl_padded_regmap_t
71:
72: #define mb() wbflush()
73:
74: #endif /* FLAMINGO */
75:
76:
77: #ifndef bt459_padded_regmap_t
78: typedef bt459_regmap_t bt459_padded_regmap_t;
79: #define wbflush()
80: #endif
81:
82: /*
83: * Generic register access
84: */
85: #define bt459_select_reg_macro(r,n) \
86: (r)->addr_lo = (n); mb(); \
87: (r)->addr_hi = (n) >> 8; \
88: wbflush();
89:
90: void
91: bt459_select_reg(
92: bt459_padded_regmap_t *regs,
93: int regno)
94: {
95: bt459_select_reg_macro( regs, regno);
96: }
97:
98: void
99: bt459_write_reg(
100: bt459_padded_regmap_t *regs,
101: int regno,
102: unsigned char val)
103: {
104: bt459_select_reg_macro( regs, regno );
105: regs->addr_reg = val;
106: wbflush();
107: }
108:
109: unsigned char
110: bt459_read_reg(
111: bt459_padded_regmap_t *regs,
112: int regno)
113: {
114: bt459_select_reg_macro( regs, regno );
115: return regs->addr_reg;
116: }
117:
118:
119: /*
120: * Color map
121: */
122: bt459_load_colormap_entry(
123: bt459_padded_regmap_t *regs,
124: int entry,
125: color_map_t *map)
126: {
127: bt459_select_reg(regs, entry & 0xff);
128:
129: regs->addr_cmap = map->red;
130: wbflush();
131: regs->addr_cmap = map->green;
132: wbflush();
133: regs->addr_cmap = map->blue;
134: wbflush();
135: }
136:
137: bt459_init_colormap(
138: bt459_padded_regmap_t *regs)
139: {
140: register int i;
141:
142: bt459_select_reg(regs, 0);
143: regs->addr_cmap = 0;
144: wbflush();
145: regs->addr_cmap = 0;
146: wbflush();
147: regs->addr_cmap = 0;
148: wbflush();
149:
150: regs->addr_cmap = 0xff;
151: wbflush();
152: regs->addr_cmap = 0xff;
153: wbflush();
154: regs->addr_cmap = 0xff;
155: wbflush();
156:
157: bt459_select_reg(regs, 255);
158: regs->addr_cmap = 0xff;
159: wbflush();
160: regs->addr_cmap = 0xff;
161: wbflush();
162: regs->addr_cmap = 0xff;
163: wbflush();
164:
165: }
166:
167: #if 1/*debug*/
168: bt459_print_colormap(
169: bt459_padded_regmap_t *regs)
170: {
171: register int i;
172:
173: for (i = 0; i < 256; i++) {
174: register unsigned char red, green, blue;
175:
176: bt459_select_reg(regs, i);
177: red = regs->addr_cmap; wbflush();
178: green = regs->addr_cmap; wbflush();
179: blue = regs->addr_cmap; wbflush();
180: printf("%x->[x%x x%x x%x]\n", i,
181: red, green, blue);
182:
183: }
184: }
185: #endif
186:
187: /*
188: * Video on/off
189: *
190: * It is unfortunate that X11 goes backward with white@0
191: * and black@1. So we must stash away the zero-th entry
192: * and fix it while screen is off. Also must remember
193: * it, sigh.
194: */
195: struct vstate {
196: bt459_padded_regmap_t *regs;
197: unsigned short off;
198: };
199:
200: bt459_video_off(
201: struct vstate *vstate,
202: user_info_t *up)
203: {
204: register bt459_padded_regmap_t *regs = vstate->regs;
205: unsigned char *save;
206:
207: if (vstate->off)
208: return;
209:
210: /* Yes, this is awful */
211: save = (unsigned char *)up->dev_dep_2.gx.colormap;
212:
213: bt459_select_reg(regs, 0);
214: *save++ = regs->addr_cmap;
215: *save++ = regs->addr_cmap;
216: *save++ = regs->addr_cmap;
217:
218: bt459_select_reg(regs, 0);
219: regs->addr_cmap = 0;
220: wbflush();
221: regs->addr_cmap = 0;
222: wbflush();
223: regs->addr_cmap = 0;
224: wbflush();
225:
226: bt459_write_reg( regs, BT459_REG_PRM, 0);
227: bt459_write_reg( regs, BT459_REG_CCR, 0);
228:
229: vstate->off = 1;
230: }
231:
232: bt459_video_on(
233: struct vstate *vstate,
234: user_info_t *up)
235: {
236: register bt459_padded_regmap_t *regs = vstate->regs;
237: unsigned char *save;
238:
239: if (!vstate->off)
240: return;
241:
242: /* Like I said.. */
243: save = (unsigned char *)up->dev_dep_2.gx.colormap;
244:
245: bt459_select_reg(regs, 0);
246: regs->addr_cmap = *save++;
247: wbflush();
248: regs->addr_cmap = *save++;
249: wbflush();
250: regs->addr_cmap = *save++;
251: wbflush();
252:
253: bt459_write_reg( regs, BT459_REG_PRM, 0xff);
254: bt459_write_reg( regs, BT459_REG_CCR, 0xc0);
255:
256: vstate->off = 0;
257: }
258:
259: /*
260: * Cursor
261: */
262: bt459_pos_cursor(
263: bt459_padded_regmap_t *regs,
264: register int x,
265: register int y)
266: {
267: #define lo(v) ((v)&0xff)
268: #define hi(v) (((v)&0xf00)>>8)
269: bt459_write_reg( regs, BT459_REG_CXLO, lo(x + 219));
270: bt459_write_reg( regs, BT459_REG_CXHI, hi(x + 219));
271: bt459_write_reg( regs, BT459_REG_CYLO, lo(y + 34));
272: bt459_write_reg( regs, BT459_REG_CYHI, hi(y + 34));
273: }
274:
275:
276: bt459_cursor_color(
277: bt459_padded_regmap_t *regs,
278: color_map_t *color)
279: {
280: register int i;
281:
282: bt459_select_reg_macro( regs, BT459_REG_CCOLOR_2);
283: for (i = 0; i < 2; i++) {
284: regs->addr_reg = color->red;
285: wbflush();
286: regs->addr_reg = color->green;
287: wbflush();
288: regs->addr_reg = color->blue;
289: wbflush();
290: color++;
291: }
292: }
293:
294: bt459_cursor_sprite(
295: bt459_padded_regmap_t *regs,
296: unsigned char *cursor)
297: {
298: register int i, j;
299:
300: /*
301: * As per specs, must run a check to see if we
302: * had contention. If so, re-write the cursor.
303: */
304: for (i = 0, j = 0; j < 2; j++) {
305: /* loop once to write */
306: for ( ; i < 1024; i++)
307: bt459_write_reg( regs, BT459_REG_CRAM_BASE+i, cursor[i]);
308:
309: /* loop to check, if fail write again */
310: for (i = 0; i < 1024; i++)
311: if (bt459_read_reg( regs, BT459_REG_CRAM_BASE+i) != cursor[i])
312: break;
313: if (i == 1024)
314: break;/* all is well now */
315: }
316: }
317:
318: /*
319: * Initialization
320: */
321: bt459_init(
322: bt459_padded_regmap_t *regs,
323: volatile char *reset,
324: int mux)
325: {
326: if (bt459_read_reg(regs, BT459_REG_ID) != 0x4a)
327: panic("bt459");
328:
329: if (mux == 4) {
330: /* use 4:1 input mux */
331: bt459_write_reg( regs, BT459_REG_CMD0, 0x40);
332: } else if (mux == 5) {
333: /* use 5:1 input mux */
334: bt459_write_reg( regs, BT459_REG_CMD0, 0xc0);
335: } /* else donno */
336:
337: *reset = 0; /* force chip reset */
338:
339: /* no zooming, no panning */
340: bt459_write_reg( regs, BT459_REG_CMD1, 0x00);
341:
342: /* signature test, X-windows cursor, no overlays, SYNC* PLL,
343: normal RAM select, 7.5 IRE pedestal, do sync */
344: bt459_write_reg( regs, BT459_REG_CMD2, 0xc2);
345:
346: /* get all pixel bits */
347: bt459_write_reg( regs, BT459_REG_PRM, 0xff);
348:
349: /* no blinking */
350: bt459_write_reg( regs, BT459_REG_PBM, 0x00);
351:
352: /* no overlay */
353: bt459_write_reg( regs, BT459_REG_ORM, 0x00);
354:
355: /* no overlay blink */
356: bt459_write_reg( regs, BT459_REG_OBM, 0x00);
357:
358: /* no interleave, no underlay */
359: bt459_write_reg( regs, BT459_REG_ILV, 0x00);
360:
361: /* normal operation, no signature analysis */
362: bt459_write_reg( regs, BT459_REG_TEST, 0x00);
363:
364: /* no blinking, 1bit cross hair, XOR reg&crosshair,
365: no crosshair on either plane 0 or 1,
366: regular cursor on both planes */
367: bt459_write_reg( regs, BT459_REG_CCR, 0xc0);
368:
369: /* home cursor */
370: bt459_write_reg( regs, BT459_REG_CXLO, 0x00);
371: bt459_write_reg( regs, BT459_REG_CXHI, 0x00);
372: bt459_write_reg( regs, BT459_REG_CYLO, 0x00);
373: bt459_write_reg( regs, BT459_REG_CYHI, 0x00);
374:
375: /* no crosshair window */
376: bt459_write_reg( regs, BT459_REG_WXLO, 0x00);
377: bt459_write_reg( regs, BT459_REG_WXHI, 0x00);
378: bt459_write_reg( regs, BT459_REG_WYLO, 0x00);
379: bt459_write_reg( regs, BT459_REG_WYHI, 0x00);
380: bt459_write_reg( regs, BT459_REG_WWLO, 0x00);
381: bt459_write_reg( regs, BT459_REG_WWHI, 0x00);
382: bt459_write_reg( regs, BT459_REG_WHLO, 0x00);
383: bt459_write_reg( regs, BT459_REG_WHHI, 0x00);
384: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.