|
|
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: fb_hdw.c
28: * Author: Alessandro Forin, Carnegie Mellon University
29: * Date: 7/91
30: *
31: * Driver for the 3max Monochrome Frame Buffer Display,
32: * hardware-level operations.
33: */
34:
35: #include <mfb.h>
36: #if (NMFB > 0)
37: #include <platforms.h>
38:
39: #include <machine/machspl.h>
40: #include <mach/std_types.h>
41: #include <chips/busses.h>
42:
43: #include <chips/screen_defs.h>
44:
45: #include <chips/pm_defs.h>
46: typedef pm_softc_t fb_softc_t;
47:
48:
49: #ifdef DECSTATION
50: #include <mips/PMAX/pmag_aa.h>
51: #include <mips/PMAX/tc.h>
52: #endif
53:
54: #ifdef FLAMINGO
55: #include <mips/PMAX/pmag_aa.h> /* XXX fixme */
56: #include <alpha/DEC/tc.h>
57: #endif
58:
59: /*
60: * Definition of the driver for the auto-configuration program.
61: */
62:
63: int fb_probe(), fb_intr();
64: static void fb_attach();
65:
66: vm_offset_t fb_std[NMFB] = { 0 };
67: struct bus_device *fb_info[NMFB];
68: struct bus_driver fb_driver =
69: { fb_probe, 0, fb_attach, 0, fb_std, "fb", fb_info,
70: 0, 0, BUS_INTR_DISABLED};
71:
72: /*
73: * Probe/Attach functions
74: */
75:
76: fb_probe( /* reg, ui */)
77: {
78: static probed_once = 0;
79:
80: /*
81: * Probing was really done sweeping the TC long ago
82: */
83: if (tc_probe("fb") == 0)
84: return 0;
85: if (probed_once++ > 1)
86: printf("[mappable] ");
87: return 1;
88: }
89:
90: static void
91: fb_attach(ui)
92: struct bus_device *ui;
93: {
94: /* ... */
95: printf(": monochrome display");
96: }
97:
98:
99: /*
100: * Interrupt routine
101: */
102:
103: fb_intr(unit,spllevel)
104: spl_t spllevel;
105: {
106: register volatile char *ack;
107:
108: /* acknowledge interrupt */
109: ack = (volatile char *) fb_info[unit]->address + FB_OFFSET_IREQ;
110: *ack = 0;
111:
112: #if mips
113: splx(spllevel);
114: #endif
115: lk201_led(unit);
116: }
117:
118: fb_vretrace(fb, on)
119: fb_softc_t *fb;
120: {
121: int i;
122:
123: for (i = 0; i < NMFB; i++)
124: if (fb_info[i]->address == (vm_offset_t)fb->framebuffer)
125: break;
126: if (i == NMFB) return;
127:
128: (*tc_enable_interrupt)(fb_info[i]->adaptor, on, 0);
129: }
130:
131: /*
132: * Video on/off
133: */
134: fb_video_on(fb, up)
135: fb_softc_t *fb;
136: user_info_t *up;
137: {
138: if (!fb->cursor_state) /* video is "on" at boot */
139: return;
140: bt455_video_on(fb->vdac_registers, up);
141: bt431_cursor_on(fb->cursor_registers);
142: fb->cursor_state = 0;
143: }
144:
145: fb_video_off(fb, up)
146: fb_softc_t *fb;
147: user_info_t *up;
148: {
149: if (fb->cursor_state)
150: return;
151: bt455_video_off(fb->vdac_registers, up);
152: bt431_cursor_off(fb->cursor_registers);
153: fb->cursor_state = 1;
154: }
155:
156: /*
157: * Boot time initialization: must make device
158: * usable as console asap.
159: */
160: extern int
161: fb_soft_reset(), fb_set_status(),
162: bt431_pos_cursor(), fb_video_on(),
163: fb_video_off(), fb_vretrace(),
164: pm_get_status(), pm_char_paint(),
165: pm_insert_line(), pm_remove_line(),
166: pm_clear_bitmap(), pm_map_page();
167:
168: static struct screen_switch fb_sw = {
169: screen_noop, /* graphic_open */
170: fb_soft_reset, /* graphic_close */
171: fb_set_status, /* set_status */
172: pm_get_status, /* get_status */
173: pm_char_paint, /* char_paint */
174: bt431_pos_cursor, /* pos_cursor */
175: pm_insert_line, /* insert_line */
176: pm_remove_line, /* remove_line */
177: pm_clear_bitmap, /* clear_bitmap */
178: fb_video_on, /* video_on */
179: fb_video_off, /* video_off */
180: fb_vretrace, /* intr_enable */
181: pm_map_page /* map_page */
182: };
183:
184: fb_cold_init(unit, up)
185: user_info_t *up;
186: {
187: fb_softc_t *fb;
188: screen_softc_t sc = screen(unit);
189: vm_offset_t base = tc_probe("fb");
190:
191: bcopy(&fb_sw, &sc->sw, sizeof(sc->sw));
192: #if 0
193: sc->flags |= MONO_SCREEN;
194: #else
195: sc->flags |= COLOR_SCREEN;
196: #endif
197: sc->frame_scanline_width = 2048;
198: sc->frame_height = 1024;
199: sc->frame_visible_width = 1280;
200: sc->frame_visible_height = 1024;
201:
202: pm_init_screen_params(sc, up);
203: (void) screen_up(unit, up);
204:
205: fb = pm_alloc(unit, base+FB_OFFSET_BT431, base+FB_OFFSET_VRAM, -1);
206: fb->vdac_registers = (char*) base + FB_OFFSET_BT455;
207:
208: screen_default_colors(up);
209:
210: fb_soft_reset(sc);
211:
212: /*
213: * Clearing the screen at boot saves from scrolling
214: * much, and speeds up booting quite a bit.
215: */
216: screen_blitc( unit, 'C'-'@');/* clear screen */
217: }
218:
219: #endif (NMFB > 0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.