Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/sbus add support for a hardware cursor via wsdisplay
details: https://anonhg.NetBSD.org/src/rev/5daae3df00da
branches: trunk
changeset: 746789:5daae3df00da
user: macallan <macallan%NetBSD.org@localhost>
date: Thu Aug 20 00:59:28 2009 +0000
description:
add support for a hardware cursor via wsdisplay
diffstat:
sys/dev/sbus/tcx.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 137 insertions(+), 6 deletions(-)
diffs (204 lines):
diff -r 56311e018610 -r 5daae3df00da sys/dev/sbus/tcx.c
--- a/sys/dev/sbus/tcx.c Wed Aug 19 23:54:33 2009 +0000
+++ b/sys/dev/sbus/tcx.c Thu Aug 20 00:59:28 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tcx.c,v 1.36 2009/08/19 20:51:47 macallan Exp $ */
+/* $NetBSD: tcx.c,v 1.37 2009/08/20 00:59:28 macallan Exp $ */
/*
* Copyright (c) 1996, 1998, 2009 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcx.c,v 1.36 2009/08/19 20:51:47 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcx.c,v 1.37 2009/08/20 00:59:28 macallan Exp $");
/*
* define for cg8 emulation on S24 (24-bit version of tcx) for the SS5;
@@ -101,6 +101,8 @@
u_char sc_cmap_green[256];
u_char sc_cmap_blue[256];
int sc_mode, sc_bg;
+ int sc_cursor_x, sc_cursor_y;
+ int sc_hotspot_x, sc_hotspot_y;
struct vcons_data vd;
};
@@ -179,6 +181,8 @@
static void tcx_eraserows(void *, int, int, long);
static void tcx_putchar(void *, int, int, u_int, long);
static void tcx_set_video(struct tcx_softc *, int);
+static int tcx_do_cursor(struct tcx_softc *, struct wsdisplay_cursor *);
+static void tcx_set_cursor(struct tcx_softc *);
struct wsdisplay_accessops tcx_accessops = {
tcx_ioctl,
@@ -238,6 +242,11 @@
sc->sc_bustag = sa->sa_bustag;
node = sa->sa_node;
+ sc->sc_cursor_x = 0x7fff;
+ sc->sc_cursor_y = 0x7fff;
+ sc->sc_hotspot_x = 0;
+ sc->sc_hotspot_y = 0;
+
fb->fb_driver = &tcx_fbdriver;
fb->fb_device = sc->sc_dev;
/* Mask out invalid flags from the user. */
@@ -357,6 +366,7 @@
}
tcx_loadcmap(sc, 0, 256);
+ tcx_set_cursor(sc);
/* enable video */
confreg = bus_space_read_4(sa->sa_bustag, sc->sc_thc, THC_MISC);
confreg |= THC_MISC_VIDEN;
@@ -495,11 +505,11 @@
static void
tcx_reset(struct tcx_softc *sc)
{
+ uint32_t reg;
- /* Disable cursor in Brooktree DAC. */
- bus_space_write_4(sc->sc_bustag, sc->sc_bt, DAC_ADDRESS,
- DAC_C1_CONTROL_0);
- bus_space_write_4(sc->sc_bustag, sc->sc_bt, DAC_CONTROL_1, 0);
+ reg = bus_space_read_4(sc->sc_bustag, sc->sc_thc, THC_MISC);
+ reg |= THC_MISC_CURSRES;
+ bus_space_write_4(sc->sc_bustag, sc->sc_thc, THC_MISC, reg);
}
static void
@@ -729,6 +739,40 @@
tcx_clearscreen(sc, 3);
}
}
+ case WSDISPLAYIO_GCURPOS:
+ {
+ struct wsdisplay_curpos *cp = (void *)data;
+
+ cp->x = sc->sc_cursor_x;
+ cp->y = sc->sc_cursor_y;
+ }
+ return 0;
+
+ case WSDISPLAYIO_SCURPOS:
+ {
+ struct wsdisplay_curpos *cp = (void *)data;
+
+ sc->sc_cursor_x = cp->x;
+ sc->sc_cursor_y = cp->y;
+ tcx_set_cursor(sc);
+ }
+ return 0;
+
+ case WSDISPLAYIO_GCURMAX:
+ {
+ struct wsdisplay_curpos *cp = (void *)data;
+
+ cp->x = 32;
+ cp->y = 32;
+ }
+ return 0;
+
+ case WSDISPLAYIO_SCURSOR:
+ {
+ struct wsdisplay_cursor *cursor = (void *)data;
+
+ return tcx_do_cursor(sc, cursor);
+ }
}
return EPASSTHROUGH;
}
@@ -1008,3 +1052,90 @@
}
}
+static int
+tcx_do_cursor(struct tcx_softc *sc, struct wsdisplay_cursor *cur)
+{
+ if (cur->which & WSDISPLAY_CURSOR_DOCUR) {
+
+ if (cur->enable) {
+ tcx_set_cursor(sc);
+ } else {
+ /* move the cursor out of sight */
+ bus_space_write_4(sc->sc_bustag, sc->sc_thc,
+ THC_CURSOR_POS, 0x7fff7fff);
+ }
+ }
+ if (cur->which & WSDISPLAY_CURSOR_DOHOT) {
+
+ sc->sc_hotspot_x = cur->hot.x;
+ sc->sc_hotspot_y = cur->hot.y;
+ tcx_set_cursor(sc);
+ }
+ if (cur->which & WSDISPLAY_CURSOR_DOPOS) {
+
+ sc->sc_cursor_x = cur->pos.x;
+ sc->sc_cursor_y = cur->pos.y;
+ tcx_set_cursor(sc);
+ }
+ if (cur->which & WSDISPLAY_CURSOR_DOCMAP) {
+#if 0
+ int i;
+
+ for (i = 0; i < cur->cmap.count; i++) {
+ bus_space_write_4(sc->sc_bustag, sc->sc_bt, DAC_ADDRESS,
+ (cur->cmap.index + i + 2) << 24);
+ bus_space_write_4(sc->sc_bustag, sc->sc_bt,
+ DAC_CURSOR_LUT, cur->cmap.red[i] << 24);
+ bus_space_write_4(sc->sc_bustag, sc->sc_bt,
+ DAC_CURSOR_LUT, cur->cmap.green[i] << 24);
+ bus_space_write_4(sc->sc_bustag, sc->sc_bt,
+ DAC_CURSOR_LUT, cur->cmap.blue[i] << 24);
+ }
+#endif
+ }
+ if (cur->which & WSDISPLAY_CURSOR_DOSHAPE) {
+#if 1
+ int i;
+ uint32_t temp, poof;
+
+ for (i = 0; i < 128; i += 4) {
+ memcpy(&temp, &cur->mask[i], 4);
+ printf("%08x -> ", temp);
+ poof = ((temp & 0x80808080) >> 7) |
+ ((temp & 0x40404040) >> 5) |
+ ((temp & 0x20202020) >> 3) |
+ ((temp & 0x10101010) >> 1) |
+ ((temp & 0x08080808) << 1) |
+ ((temp & 0x04040404) << 3) |
+ ((temp & 0x02020202) << 5) |
+ ((temp & 0x01010101) << 7);
+ printf("%08x\n", poof);
+ bus_space_write_4(sc->sc_bustag, sc->sc_thc,
+ THC_CURSOR_1 + i, poof);
+ memcpy(&temp, &cur->image[i], 4);
+ poof = ((temp & 0x80808080) >> 7) |
+ ((temp & 0x40404040) >> 5) |
+ ((temp & 0x20202020) >> 3) |
+ ((temp & 0x10101010) >> 1) |
+ ((temp & 0x08080808) << 1) |
+ ((temp & 0x04040404) << 3) |
+ ((temp & 0x02020202) << 5) |
+ ((temp & 0x01010101) << 7);
+ bus_space_write_4(sc->sc_bustag, sc->sc_thc,
+ THC_CURSOR_0 + i, poof);
+ }
+ }
+#endif
+ return 0;
+}
+
+static void
+tcx_set_cursor(struct tcx_softc *sc)
+{
+ uint32_t reg;
+
+ reg = (sc->sc_cursor_x - sc->sc_hotspot_x) << 16 |
+ ((sc->sc_cursor_y - sc->sc_hotspot_y) & 0xffff);
+ bus_space_write_4(sc->sc_bustag, sc->sc_thc, THC_CURSOR_POS, reg);
+}
+
Home |
Main Index |
Thread Index |
Old Index