summaryrefslogtreecommitdiff
path: root/chips/cfb_misc.c
diff options
context:
space:
mode:
authorThomas Bushnell <thomas@gnu.org>1997-02-25 21:28:37 +0000
committerThomas Bushnell <thomas@gnu.org>1997-02-25 21:28:37 +0000
commitf07a4c844da9f0ecae5bbee1ab94be56505f26f7 (patch)
tree12b07c7e578fc1a5f53dbfde2632408491ff2a70 /chips/cfb_misc.c
Initial source
Diffstat (limited to 'chips/cfb_misc.c')
-rw-r--r--chips/cfb_misc.c249
1 files changed, 249 insertions, 0 deletions
diff --git a/chips/cfb_misc.c b/chips/cfb_misc.c
new file mode 100644
index 0000000..2bda86b
--- /dev/null
+++ b/chips/cfb_misc.c
@@ -0,0 +1,249 @@
+/*
+ * 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: cfb_misc.c
+ * Author: Alessandro Forin, Carnegie Mellon University
+ * Date: 9/90
+ *
+ * Driver for the PMAG-BA simple color framebuffer
+ *
+ */
+
+#include <cfb.h>
+#include <sfb.h> /* shares code */
+#if ((NCFB > 0) || (NSFB > 0))
+#include <platforms.h>
+
+/*
+ * NOTE: This driver relies heavily on the pm one.
+ */
+
+#include <device/device_types.h>
+#include <chips/screen_defs.h>
+#include <chips/pm_defs.h>
+typedef pm_softc_t cfb_softc_t;
+
+#include <chips/bt459.h>
+#define bt459 cursor_registers
+
+#ifdef DECSTATION
+#include <mips/PMAX/pmag_ba.h>
+#endif
+
+#ifdef FLAMINGO
+#include <mips/PMAX/pmag_ba.h> /* XXX fixme */
+#endif
+
+/*
+ * Initialize color map, for kernel use
+ */
+cfb_init_colormap(
+ screen_softc_t sc)
+{
+ cfb_softc_t *cfb = (cfb_softc_t*)sc->hw_state;
+ user_info_t *up = sc->up;
+ color_map_t Bg_Fg[2];
+ register int i;
+
+ bt459_init_colormap( cfb->bt459 );
+
+ /* init bg/fg colors */
+ for (i = 0; i < 3; i++) {
+ up->dev_dep_2.pm.Bg_color[i] = 0x00;
+ up->dev_dep_2.pm.Fg_color[i] = 0xff;
+ }
+
+ Bg_Fg[0].red = Bg_Fg[0].green = Bg_Fg[0].blue = 0x00;
+ Bg_Fg[1].red = Bg_Fg[1].green = Bg_Fg[1].blue = 0xff;
+ bt459_cursor_color( cfb->bt459, Bg_Fg);
+}
+
+/*
+ * Large viz small cursor
+ */
+cfb_small_cursor_to_large(
+ user_info_t *up,
+ cursor_sprite_t cursor)
+{
+ unsigned short new_cursor[32];
+ unsigned char *curbytes, fg, fbg;
+ int i, j, k;
+ char *sprite;
+
+ /* Clear out old cursor */
+ bzero( up->dev_dep_2.pm.cursor_sprite,
+ sizeof(up->dev_dep_2.pm.cursor_sprite));
+
+ /* small cursor is 32x2 bytes, fg first */
+ curbytes = (unsigned char *) cursor;
+
+ /* use the upper left corner of the large cursor
+ * as a 64x1 cursor, fg&bg alternated */
+ for (i = 0; i < 32; i++) {
+ fg = curbytes[i];
+ fbg = fg | curbytes[i + 32];
+ new_cursor[i] = 0;
+ for (j = 0, k = 15; j < 8; j++, k -= 2) {
+ new_cursor[i] |= ((fbg >> j) & 0x1) << (k);
+ new_cursor[i] |= ((fg >> j) & 0x1) << (k - 1);
+ }
+ }
+
+ /* Now stick it in the proper place */
+
+ curbytes = (unsigned char *) new_cursor;
+ sprite = up->dev_dep_2.pm.cursor_sprite;
+ for (i = 0; i < 64; i += 4) {
+ /* butterfly as we go */
+ *sprite++ = curbytes[i + 1];
+ *sprite++ = curbytes[i + 0];
+ *sprite++ = curbytes[i + 3];
+ *sprite++ = curbytes[i + 2];
+ sprite += 12; /* skip rest of the line */
+ }
+}
+
+
+/*
+ * Device-specific set status
+ */
+cfb_set_status(
+ screen_softc_t sc,
+ dev_flavor_t flavor,
+ dev_status_t status,
+ natural_t status_count)
+{
+ cfb_softc_t *cfb = (cfb_softc_t*) sc->hw_state;
+
+ switch (flavor) {
+
+ case SCREEN_ADJ_MAPPED_INFO:
+ return pm_set_status(sc, flavor, status, status_count);
+
+ case SCREEN_LOAD_CURSOR:
+
+ if (status_count < sizeof(cursor_sprite_t)/sizeof(int))
+ return D_INVALID_SIZE;
+/* cfb_small_cursor_to_large(sc->up, (cursor_sprite_t) status);*/
+ cfb_small_cursor_to_large(sc->up, (unsigned short *) status);
+
+ /* Fall through */
+
+ case SCREEN_LOAD_CURSOR_LONG: /* 3max only */
+
+ sc->flags |= SCREEN_BEING_UPDATED;
+ bt459_cursor_sprite(cfb->bt459, sc->up->dev_dep_2.pm.cursor_sprite);
+ sc->flags &= ~SCREEN_BEING_UPDATED;
+
+ break;
+
+ case SCREEN_SET_CURSOR_COLOR: {
+ color_map_t c[2];
+ register cursor_color_t *cc = (cursor_color_t*) status;
+
+ c[0].red = cc->Bg_rgb[0];
+ c[0].green = cc->Bg_rgb[1];
+ c[0].blue = cc->Bg_rgb[2];
+ c[1].red = cc->Fg_rgb[0];
+ c[1].green = cc->Fg_rgb[1];
+ c[1].blue = cc->Fg_rgb[2];
+
+ sc->flags |= SCREEN_BEING_UPDATED;
+ bt459_cursor_color (cfb->bt459, c );
+ sc->flags &= ~SCREEN_BEING_UPDATED;
+
+ break;
+ }
+
+ case SCREEN_SET_CMAP_ENTRY: {
+ color_map_entry_t *e = (color_map_entry_t*) status;
+
+ if (e->index < 256) {
+ sc->flags |= SCREEN_BEING_UPDATED;
+ bt459_load_colormap_entry( cfb->bt459, e->index, &e->value);
+ sc->flags &= ~SCREEN_BEING_UPDATED;
+ }
+ break;
+ }
+
+ default:
+ return D_INVALID_OPERATION;
+ }
+ return D_SUCCESS;
+}
+
+#if (NCFB > 0)
+/*
+ * Hardware initialization
+ */
+cfb_init_screen(
+ cfb_softc_t *cfb)
+{
+ bt459_init( cfb->bt459,
+ cfb->bt459 + (CFB_OFFSET_RESET - CFB_OFFSET_BT459),
+ 4 /* 4:1 MUX */);
+}
+
+/*
+ * Do what's needed when X exits
+ */
+cfb_soft_reset(
+ screen_softc_t sc)
+{
+ cfb_softc_t *cfb = (cfb_softc_t*) sc->hw_state;
+ user_info_t *up = sc->up;
+ extern cursor_sprite_t dc503_default_cursor;
+
+ /*
+ * Restore params in mapped structure
+ */
+ pm_init_screen_params(sc,up);
+ up->row = up->max_row - 1;
+
+ up->dev_dep_2.pm.x26 = 2; /* you do not want to know */
+ up->dev_dep_1.pm.x18 = (short*)2;
+
+ /*
+ * Restore RAMDAC chip to default state
+ */
+ cfb_init_screen(cfb);
+
+ /*
+ * Load kernel's cursor sprite: just use the same pmax one
+ */
+ cfb_small_cursor_to_large(up, dc503_default_cursor);
+ bt459_cursor_sprite(cfb->bt459, up->dev_dep_2.pm.cursor_sprite);
+
+ /*
+ * Color map and cursor color
+ */
+ cfb_init_colormap(sc);
+}
+#endif /* NCFB > 0 */
+
+
+
+#endif /* (NCFB > 0) || (NSFB > 0) */