summaryrefslogtreecommitdiff
path: root/sys/dev/wsfb
diff options
context:
space:
mode:
authormacallan <macallan@NetBSD.org>2007-04-14 19:56:05 +0000
committermacallan <macallan@NetBSD.org>2007-04-14 19:56:05 +0000
commitaa2949fa772d3166457f9a706dd4e78ae4072cd3 (patch)
tree6aeb3b15b84f74a801dd579496a5d8584c39d462 /sys/dev/wsfb
parentdd9aa16186d99a98573121c2e3aed47ae54cd946 (diff)
add a callback to change the colour map
so now X with wsfb on top of genfb should look right
Diffstat (limited to 'sys/dev/wsfb')
-rw-r--r--sys/dev/wsfb/genfb.c25
-rw-r--r--sys/dev/wsfb/genfbvar.h10
2 files changed, 29 insertions, 6 deletions
diff --git a/sys/dev/wsfb/genfb.c b/sys/dev/wsfb/genfb.c
index 634a0b3db66..415c3b9787e 100644
--- a/sys/dev/wsfb/genfb.c
+++ b/sys/dev/wsfb/genfb.c
@@ -1,4 +1,4 @@
-/* $NetBSD: genfb.c,v 1.3 2007/04/11 04:47:09 macallan Exp $ */
+/* $NetBSD: genfb.c,v 1.4 2007/04/14 19:56:05 macallan Exp $ */
/*-
* Copyright (c) 2007 Michael Lorenz
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfb.c,v 1.3 2007/04/11 04:47:09 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfb.c,v 1.4 2007/04/14 19:56:05 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -81,6 +81,7 @@ void
genfb_init(struct genfb_softc *sc)
{
prop_dictionary_t dict;
+ uint64_t cmap_cb;
uint32_t fboffset;
dict = device_properties(&sc->sc_dev);
@@ -102,6 +103,13 @@ genfb_init(struct genfb_softc *sc)
if (!prop_dictionary_get_uint32(dict, "linebytes", &sc->sc_stride))
sc->sc_stride = (sc->sc_width * sc->sc_depth) >> 3;
sc->sc_fbsize = sc->sc_width * sc->sc_stride;
+
+ /* optional colour map callback */
+ sc->sc_cmcb = NULL;
+ if (prop_dictionary_get_uint64(dict, "cmap_callback", &cmap_cb)) {
+ if (cmap_cb != 0)
+ sc->sc_cmcb = (void *)(vaddr_t)cmap_cb;
+ }
}
int
@@ -155,7 +163,11 @@ genfb_attach(struct genfb_softc *sc, struct genfb_ops *ops)
}
j = 0;
- for (i = 0; i < 256; i++) {
+ for (i = 0; i < (1 << (sc->sc_depth - 1)); i++) {
+
+ sc->sc_cmap_red[i] = rasops_cmap[j];
+ sc->sc_cmap_green[i] = rasops_cmap[j + 1];
+ sc->sc_cmap_blue[i] = rasops_cmap[j + 2];
genfb_putpalreg(sc, i, rasops_cmap[j], rasops_cmap[j + 1],
rasops_cmap[j + 2]);
j += 3;
@@ -331,7 +343,7 @@ genfb_restore_palette(struct genfb_softc *sc)
{
int i;
- for (i = 0; i < 256; i++) {
+ for (i = 0; i < (1 << (sc->sc_depth - 1)); i++) {
genfb_putpalreg(sc, i, sc->sc_cmap_red[i],
sc->sc_cmap_green[i], sc->sc_cmap_blue[i]);
}
@@ -342,6 +354,11 @@ genfb_putpalreg(struct genfb_softc *sc, uint8_t idx, uint8_t r, uint8_t g,
uint8_t b)
{
+ if (sc->sc_cmcb) {
+
+ sc->sc_cmcb->gcc_set_mapreg(sc->sc_cmcb->gcc_cookie,
+ idx, r, g, b);
+ }
return 0;
}
diff --git a/sys/dev/wsfb/genfbvar.h b/sys/dev/wsfb/genfbvar.h
index ac0b3a2c550..6644c0b5d21 100644
--- a/sys/dev/wsfb/genfbvar.h
+++ b/sys/dev/wsfb/genfbvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: genfbvar.h,v 1.2 2007/04/10 00:14:42 macallan Exp $ */
+/* $NetBSD: genfbvar.h,v 1.3 2007/04/14 19:56:05 macallan Exp $ */
/*-
* Copyright (c) 2007 Michael Lorenz
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfbvar.h,v 1.2 2007/04/10 00:14:42 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfbvar.h,v 1.3 2007/04/14 19:56:05 macallan Exp $");
#ifndef GENFBVAR_H
#define GENFBVAR_H
@@ -53,6 +53,11 @@ struct genfb_ops {
paddr_t (*genfb_mmap)(void *, void *, off_t, int);
};
+struct genfb_colormap_callback {
+ void *gcc_cookie;
+ void (*gcc_set_mapreg)(void *, int, int, int, int);
+};
+
struct genfb_softc {
struct device sc_dev;
struct vcons_data vd;
@@ -61,6 +66,7 @@ struct genfb_softc {
struct wsscreen_descr sc_defaultscreen_descr;
const struct wsscreen_descr *sc_screens[1];
struct wsscreen_list sc_screenlist;
+ struct genfb_colormap_callback *sc_cmcb;
void * sc_fbaddr; /* kva */
bus_addr_t sc_fboffset; /* bus address */
int sc_width, sc_height, sc_stride, sc_depth;