summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2008-12-13 20:13:22 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2008-12-13 20:13:22 +0000
commitf830e5c602f9c1dc13239abb288b9b144920be0b (patch)
treea94a5809a0358dbb986c5846bdc2f585841a32cb /sys/powerpc
parent98e7fe0e6a4b7ee298fffadcf232867ffeecbad6 (diff)
downloadFreeBSD-src-f830e5c602f9c1dc13239abb288b9b144920be0b.zip
FreeBSD-src-f830e5c602f9c1dc13239abb288b9b144920be0b.tar.gz
Add support for a console mouse pointer on Open Firmware syscons.
MFC after: 7.1-RELEASE
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/ofw/ofw_syscons.c85
-rw-r--r--sys/powerpc/ofw/ofw_syscons.h1
2 files changed, 85 insertions, 1 deletions
diff --git a/sys/powerpc/ofw/ofw_syscons.c b/sys/powerpc/ofw/ofw_syscons.c
index 373ba11..0ef95ee 100644
--- a/sys/powerpc/ofw/ofw_syscons.c
+++ b/sys/powerpc/ofw/ofw_syscons.c
@@ -137,10 +137,12 @@ static video_switch_t ofwfbvidsw = {
*/
static vi_blank_display_t ofwfb_blank_display8;
static vi_putc_t ofwfb_putc8;
+static vi_putm_t ofwfb_putm8;
static vi_set_border_t ofwfb_set_border8;
static vi_blank_display_t ofwfb_blank_display32;
static vi_putc_t ofwfb_putc32;
+static vi_putm_t ofwfb_putm32;
static vi_set_border_t ofwfb_set_border32;
VIDEO_DRIVER(ofwfb, ofwfbvidsw, ofwfb_configure);
@@ -250,10 +252,12 @@ ofwfb_configure(int flags)
if (depth == 8) {
sc->sc_blank = ofwfb_blank_display8;
sc->sc_putc = ofwfb_putc8;
+ sc->sc_putm = ofwfb_putm8;
sc->sc_set_border = ofwfb_set_border8;
} else if (depth == 32) {
sc->sc_blank = ofwfb_blank_display32;
sc->sc_putc = ofwfb_putc32;
+ sc->sc_putm = ofwfb_putm32;
sc->sc_set_border = ofwfb_set_border32;
} else
return (0);
@@ -823,7 +827,86 @@ ofwfb_putm(video_adapter_t *adp, int x, int y, uint8_t *pixel_image,
sc = (struct ofwfb_softc *)adp;
- /* put mouse */
+ return ((*sc->sc_putm)(adp, x, y, pixel_image, pixel_mask, size,
+ width));
+}
+
+static int
+ofwfb_putm8(video_adapter_t *adp, int x, int y, uint8_t *pixel_image,
+ uint32_t pixel_mask, int size, int width)
+{
+ struct ofwfb_softc *sc;
+ int i, j, k;
+ uint32_t *addr;
+ u_char fg, bg;
+ union {
+ uint32_t l[2];
+ uint8_t c[8];
+ } ch;
+
+
+ sc = (struct ofwfb_softc *)adp;
+ addr = (u_int32_t *)((int)sc->sc_addr
+ + (y + sc->sc_ymargin)*sc->sc_stride
+ + x + sc->sc_xmargin);
+
+ fg = ofwfb_foreground(SC_NORM_ATTR);
+ bg = ofwfb_background(SC_NORM_ATTR);
+
+ for (i = 0; i < size && i+y < sc->sc_height - 2*sc->sc_ymargin; i++) {
+ /*
+ * Use the current values for the line
+ */
+ ch.l[0] = addr[0];
+ ch.l[1] = addr[1];
+
+ /*
+ * Calculate 2 x 4-chars at a time, and then
+ * write these out.
+ */
+ for (j = 0, k = width; j < 8; j++, k--) {
+ if (x + j >= sc->sc_width - 2*sc->sc_xmargin)
+ continue;
+
+ if (pixel_image[i] & (1 << k))
+ ch.c[j] = (ch.c[j] == fg) ? bg : fg;
+ }
+
+ addr[0] = ch.l[0];
+ addr[1] = ch.l[1];
+ addr += (sc->sc_stride / sizeof(u_int32_t));
+ }
+
+ return (0);
+}
+
+static int
+ofwfb_putm32(video_adapter_t *adp, int x, int y, uint8_t *pixel_image,
+ uint32_t pixel_mask, int size, int width)
+{
+ struct ofwfb_softc *sc;
+ int i, j, k;
+ uint32_t fg, bg;
+ uint32_t *addr;
+
+ sc = (struct ofwfb_softc *)adp;
+ addr = (uint32_t *)sc->sc_addr
+ + (y + sc->sc_ymargin)*(sc->sc_stride/4)
+ + x + sc->sc_xmargin;
+
+ fg = ofwfb_pix32(ofwfb_foreground(SC_NORM_ATTR));
+ bg = ofwfb_pix32(ofwfb_background(SC_NORM_ATTR));
+
+ for (i = 0; i < size && i+y < sc->sc_height - 2*sc->sc_ymargin; i++) {
+ for (j = 0, k = width; j < 8; j++, k--) {
+ if (x + j >= sc->sc_width - 2*sc->sc_xmargin)
+ continue;
+
+ if (pixel_image[i] & (1 << k))
+ *(addr + j) = (*(addr + j) == fg) ? bg : fg;
+ }
+ addr += (sc->sc_stride/4);
+ }
return (0);
}
diff --git a/sys/powerpc/ofw/ofw_syscons.h b/sys/powerpc/ofw/ofw_syscons.h
index af33c52..01b9727 100644
--- a/sys/powerpc/ofw/ofw_syscons.h
+++ b/sys/powerpc/ofw/ofw_syscons.h
@@ -51,6 +51,7 @@ struct ofwfb_softc {
vi_blank_display_t *sc_blank;
vi_putc_t *sc_putc;
+ vi_putm_t *sc_putm;
vi_set_border_t *sc_set_border;
#define OFWSC_MAXADDR 8
OpenPOWER on IntegriCloud