diff options
author | Thomas Bushnell <thomas@gnu.org> | 1997-02-25 21:28:37 +0000 |
---|---|---|
committer | Thomas Bushnell <thomas@gnu.org> | 1997-02-25 21:28:37 +0000 |
commit | f07a4c844da9f0ecae5bbee1ab94be56505f26f7 (patch) | |
tree | 12b07c7e578fc1a5f53dbfde2632408491ff2a70 /chips/xcfb_hdw.c | |
download | gnumach-f07a4c844da9f0ecae5bbee1ab94be56505f26f7.tar.gz gnumach-f07a4c844da9f0ecae5bbee1ab94be56505f26f7.tar.bz2 gnumach-f07a4c844da9f0ecae5bbee1ab94be56505f26f7.zip |
Initial source
Diffstat (limited to 'chips/xcfb_hdw.c')
-rw-r--r-- | chips/xcfb_hdw.c | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/chips/xcfb_hdw.c b/chips/xcfb_hdw.c new file mode 100644 index 00000000..b2c67d67 --- /dev/null +++ b/chips/xcfb_hdw.c @@ -0,0 +1,230 @@ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + * File: xcfb_hdw.c + * Author: Alessandro Forin, Carnegie Mellon University + * Date: 1/92 + * + * Driver for the MAXine Color Frame Buffer Display, + * hardware-level operations. + */ + +#include <xcfb.h> +#if (NXCFB > 0) + +#include <platforms.h> + +#include <machine/machspl.h> +#include <mach/std_types.h> +#include <chips/busses.h> + +#include <chips/screen_defs.h> +#include <chips/pm_defs.h> +#include <machine/machspl.h> + +#ifdef MAXINE + +#include <chips/xcfb_monitor.h> + +#include <mips/PMAX/pmag_xine.h> +#include <mips/PMAX/tc.h> +#define enable_interrupt(s,o,x) (*tc_enable_interrupt)(s,o,x) + +#else /* MAXINE */ +You must say the magic words to get the coockies: +#define enable_interrupt(slot,on,xx) +#define IMS332_ADDRESS +#define VRAM_OFFSET +#define IMS332_RESET_ADDRESS +#endif /* MAXINE */ + +typedef pm_softc_t xcfb_softc_t; + + +/* + * Definition of the driver for the auto-configuration program. + */ + +int xcfb_probe(), xcfb_intr(); +static void xcfb_attach(); + +vm_offset_t xcfb_std[NXCFB] = { 0 }; +struct bus_device *xcfb_info[NXCFB]; +struct bus_driver xcfb_driver = + { xcfb_probe, 0, xcfb_attach, 0, xcfb_std, "xcfb", xcfb_info, + 0, 0, BUS_INTR_DISABLED}; + +/* + * Probe/Attach functions + */ + +xcfb_probe( /* reg, ui */) +{ + static probed_once = 0; + + /* + * Probing was really done sweeping the TC long ago + */ + if (tc_probe("xcfb") == 0) + return 0; + if (probed_once++ > 1) + printf("[mappable] "); + return 1; +} + +static void +xcfb_attach(ui) + struct bus_device *ui; +{ + /* ... */ + printf(": color display"); +} + + +/* + * Interrupt routine + */ + +xcfb_intr(unit,spllevel) + spl_t spllevel; +{ + /* interrupt has been acknowledge already */ +#if 0 + splx(spllevel); + /* XXX make it load the unsafe things */ +#endif +} + +xcfb_vretrace(xcfb, on) + xcfb_softc_t *xcfb; +{ + int i; + + for (i = 0; i < NXCFB; i++) + if (xcfb_info[i]->address == (vm_offset_t)xcfb->framebuffer) + break; + if (i == NXCFB) return; + + enable_interrupt(xcfb_info[i]->adaptor, on, 0); +} + +/* + * Boot time initialization: must make device + * usable as console asap. + */ + +/* some of these values are made up using ad hocery */ +static struct xcfb_monitor_type monitors[] = { + { "VRM17", 1024, 768, 1024, 1024, 16, 33, + 6, 2, 2, 21, 326, 16, 10, 10 }, + /* XXX Add VRC16 */ + { "VR262", 1024, 864, 1024, 1024, 16, 35, + 5, 3, 3, 37, 330, 16, 10, 10 }, + { "VR299", 1024, 864, 1024, 1024, 16, 35, + 5, 3, 3, 37, 330, 16, 10, 10 }, + { 0 }}; + +/* set from prom command line */ +extern unsigned char *monitor_types[4]; + +xcfb_monitor_type_t xcfb_get_monitor_type() +{ + xcfb_monitor_type_t m; + + m = monitors; + if (monitor_types[3]) + while (m->name) { + /* xcfb is always on the motherboard (slot 3), + fix if you need */ + if (!strcmp(monitor_types[3], m->name)) + break; + m++; + } + if (!m->name) /* the first is the default */ + m = monitors; + return m; +} + + +extern int + xcfb_soft_reset(), xcfb_set_status(), + ims332_pos_cursor(), ims332_video_on(), + ims332_video_off(), xcfb_vretrace(), + pm_get_status(), pm_char_paint(), + pm_insert_line(), pm_remove_line(), + pm_clear_bitmap(), pm_map_page(); + +static struct screen_switch xcfb_sw = { + screen_noop, /* graphic_open */ + xcfb_soft_reset, /* graphic_close */ + xcfb_set_status, /* set_status */ + pm_get_status, /* get_status */ + pm_char_paint, /* char_paint */ + ims332_pos_cursor, /* pos_cursor */ + pm_insert_line, /* insert_line */ + pm_remove_line, /* remove_line */ + pm_clear_bitmap, /* clear_bitmap */ + ims332_video_on, /* video_on */ + ims332_video_off, /* video_off */ + xcfb_vretrace, /* intr_enable */ + pm_map_page /* map_page */ +}; + +xcfb_cold_init(unit, up) + user_info_t *up; +{ + xcfb_softc_t *xcfb; + screen_softc_t sc = screen(unit); + int base = tc_probe("xcfb"); + xcfb_monitor_type_t m = xcfb_get_monitor_type(); + + bcopy(&xcfb_sw, &sc->sw, sizeof(sc->sw)); + + sc->flags |= COLOR_SCREEN; /* XXX should come from m->flags? */ + sc->frame_scanline_width = m->frame_scanline_width; + sc->frame_height = m->frame_height; + sc->frame_visible_width = m->frame_visible_width; + sc->frame_visible_height = m->frame_visible_height; + + pm_init_screen_params(sc, up); + (void) screen_up(unit, up); + + xcfb = pm_alloc(unit, IMS332_ADDRESS, base + VRAM_OFFSET, 0); + xcfb->vdac_registers = (char *)IMS332_RESET_ADDRESS; + + screen_default_colors(up); + + xcfb_soft_reset(sc); + + /* + * Clearing the screen at boot saves from scrolling + * much, and speeds up booting quite a bit. + */ + screen_blitc( unit, 'C'-'@');/* clear screen */ +} + + +#endif (NXCFB > 0) |