|
|
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: cfb_misc.c
28: * Author: Alessandro Forin, Carnegie Mellon University
29: * Date: 9/90
30: *
31: * Driver for the PMAG-BA simple color framebuffer
32: *
33: */
34:
35: #include <cfb.h>
36: #include <sfb.h> /* shares code */
37: #if ((NCFB > 0) || (NSFB > 0))
38: #include <platforms.h>
39:
40: /*
41: * NOTE: This driver relies heavily on the pm one.
42: */
43:
44: #include <device/device_types.h>
45: #include <chips/screen_defs.h>
46: #include <chips/pm_defs.h>
47: typedef pm_softc_t cfb_softc_t;
48:
49: #include <chips/bt459.h>
50: #define bt459 cursor_registers
51:
52: #ifdef DECSTATION
53: #include <mips/PMAX/pmag_ba.h>
54: #endif
55:
56: #ifdef FLAMINGO
57: #include <mips/PMAX/pmag_ba.h> /* XXX fixme */
58: #endif
59:
60: /*
61: * Initialize color map, for kernel use
62: */
63: cfb_init_colormap(
64: screen_softc_t sc)
65: {
66: cfb_softc_t *cfb = (cfb_softc_t*)sc->hw_state;
67: user_info_t *up = sc->up;
68: color_map_t Bg_Fg[2];
69: register int i;
70:
71: bt459_init_colormap( cfb->bt459 );
72:
73: /* init bg/fg colors */
74: for (i = 0; i < 3; i++) {
75: up->dev_dep_2.pm.Bg_color[i] = 0x00;
76: up->dev_dep_2.pm.Fg_color[i] = 0xff;
77: }
78:
79: Bg_Fg[0].red = Bg_Fg[0].green = Bg_Fg[0].blue = 0x00;
80: Bg_Fg[1].red = Bg_Fg[1].green = Bg_Fg[1].blue = 0xff;
81: bt459_cursor_color( cfb->bt459, Bg_Fg);
82: }
83:
84: /*
85: * Large viz small cursor
86: */
87: cfb_small_cursor_to_large(
88: user_info_t *up,
89: cursor_sprite_t cursor)
90: {
91: unsigned short new_cursor[32];
92: unsigned char *curbytes, fg, fbg;
93: int i, j, k;
94: char *sprite;
95:
96: /* Clear out old cursor */
97: bzero( up->dev_dep_2.pm.cursor_sprite,
98: sizeof(up->dev_dep_2.pm.cursor_sprite));
99:
100: /* small cursor is 32x2 bytes, fg first */
101: curbytes = (unsigned char *) cursor;
102:
103: /* use the upper left corner of the large cursor
104: * as a 64x1 cursor, fg&bg alternated */
105: for (i = 0; i < 32; i++) {
106: fg = curbytes[i];
107: fbg = fg | curbytes[i + 32];
108: new_cursor[i] = 0;
109: for (j = 0, k = 15; j < 8; j++, k -= 2) {
110: new_cursor[i] |= ((fbg >> j) & 0x1) << (k);
111: new_cursor[i] |= ((fg >> j) & 0x1) << (k - 1);
112: }
113: }
114:
115: /* Now stick it in the proper place */
116:
117: curbytes = (unsigned char *) new_cursor;
118: sprite = up->dev_dep_2.pm.cursor_sprite;
119: for (i = 0; i < 64; i += 4) {
120: /* butterfly as we go */
121: *sprite++ = curbytes[i + 1];
122: *sprite++ = curbytes[i + 0];
123: *sprite++ = curbytes[i + 3];
124: *sprite++ = curbytes[i + 2];
125: sprite += 12; /* skip rest of the line */
126: }
127: }
128:
129:
130: /*
131: * Device-specific set status
132: */
133: cfb_set_status(
134: screen_softc_t sc,
135: dev_flavor_t flavor,
136: dev_status_t status,
137: natural_t status_count)
138: {
139: cfb_softc_t *cfb = (cfb_softc_t*) sc->hw_state;
140:
141: switch (flavor) {
142:
143: case SCREEN_ADJ_MAPPED_INFO:
144: return pm_set_status(sc, flavor, status, status_count);
145:
146: case SCREEN_LOAD_CURSOR:
147:
148: if (status_count < sizeof(cursor_sprite_t)/sizeof(int))
149: return D_INVALID_SIZE;
150: /* cfb_small_cursor_to_large(sc->up, (cursor_sprite_t) status);*/
151: cfb_small_cursor_to_large(sc->up, (unsigned short *) status);
152:
153: /* Fall through */
154:
155: case SCREEN_LOAD_CURSOR_LONG: /* 3max only */
156:
157: sc->flags |= SCREEN_BEING_UPDATED;
158: bt459_cursor_sprite(cfb->bt459, sc->up->dev_dep_2.pm.cursor_sprite);
159: sc->flags &= ~SCREEN_BEING_UPDATED;
160:
161: break;
162:
163: case SCREEN_SET_CURSOR_COLOR: {
164: color_map_t c[2];
165: register cursor_color_t *cc = (cursor_color_t*) status;
166:
167: c[0].red = cc->Bg_rgb[0];
168: c[0].green = cc->Bg_rgb[1];
169: c[0].blue = cc->Bg_rgb[2];
170: c[1].red = cc->Fg_rgb[0];
171: c[1].green = cc->Fg_rgb[1];
172: c[1].blue = cc->Fg_rgb[2];
173:
174: sc->flags |= SCREEN_BEING_UPDATED;
175: bt459_cursor_color (cfb->bt459, c );
176: sc->flags &= ~SCREEN_BEING_UPDATED;
177:
178: break;
179: }
180:
181: case SCREEN_SET_CMAP_ENTRY: {
182: color_map_entry_t *e = (color_map_entry_t*) status;
183:
184: if (e->index < 256) {
185: sc->flags |= SCREEN_BEING_UPDATED;
186: bt459_load_colormap_entry( cfb->bt459, e->index, &e->value);
187: sc->flags &= ~SCREEN_BEING_UPDATED;
188: }
189: break;
190: }
191:
192: default:
193: return D_INVALID_OPERATION;
194: }
195: return D_SUCCESS;
196: }
197:
198: #if (NCFB > 0)
199: /*
200: * Hardware initialization
201: */
202: cfb_init_screen(
203: cfb_softc_t *cfb)
204: {
205: bt459_init( cfb->bt459,
206: cfb->bt459 + (CFB_OFFSET_RESET - CFB_OFFSET_BT459),
207: 4 /* 4:1 MUX */);
208: }
209:
210: /*
211: * Do what's needed when X exits
212: */
213: cfb_soft_reset(
214: screen_softc_t sc)
215: {
216: cfb_softc_t *cfb = (cfb_softc_t*) sc->hw_state;
217: user_info_t *up = sc->up;
218: extern cursor_sprite_t dc503_default_cursor;
219:
220: /*
221: * Restore params in mapped structure
222: */
223: pm_init_screen_params(sc,up);
224: up->row = up->max_row - 1;
225:
226: up->dev_dep_2.pm.x26 = 2; /* you do not want to know */
227: up->dev_dep_1.pm.x18 = (short*)2;
228:
229: /*
230: * Restore RAMDAC chip to default state
231: */
232: cfb_init_screen(cfb);
233:
234: /*
235: * Load kernel's cursor sprite: just use the same pmax one
236: */
237: cfb_small_cursor_to_large(up, dc503_default_cursor);
238: bt459_cursor_sprite(cfb->bt459, up->dev_dep_2.pm.cursor_sprite);
239:
240: /*
241: * Color map and cursor color
242: */
243: cfb_init_colormap(sc);
244: }
245: #endif /* NCFB > 0 */
246:
247:
248:
249: #endif /* (NCFB > 0) || (NSFB > 0) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.