Module Name: src Committed By: macallan Date: Wed Jul 17 07:11:01 UTC 2024
Modified Files: src/sys/arch/hppa/dev: hyperfb.c Log Message: add cursor sprite support To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/hppa/dev/hyperfb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/hppa/dev/hyperfb.c diff -u src/sys/arch/hppa/dev/hyperfb.c:1.2 src/sys/arch/hppa/dev/hyperfb.c:1.3 --- src/sys/arch/hppa/dev/hyperfb.c:1.2 Mon Jul 15 10:26:09 2024 +++ src/sys/arch/hppa/dev/hyperfb.c Wed Jul 17 07:11:01 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: hyperfb.c,v 1.2 2024/07/15 10:26:09 macallan Exp $ */ +/* $NetBSD: hyperfb.c,v 1.3 2024/07/17 07:11:01 macallan Exp $ */ /* * Copyright (c) 2024 Michael Lorenz @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hyperfb.c,v 1.2 2024/07/15 10:26:09 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hyperfb.c,v 1.3 2024/07/17 07:11:01 macallan Exp $"); #include "opt_cputype.h" #include "opt_hyperfb.h" @@ -145,10 +145,8 @@ static void hyperfb_erasecols(void *, in static void hyperfb_copyrows(void *, int, int, int); static void hyperfb_eraserows(void *, int, int, long); -#if 0 static void hyperfb_move_cursor(struct hyperfb_softc *, int, int); static int hyperfb_do_cursor(struct hyperfb_softc *, struct wsdisplay_cursor *); -#endif #define BA(F,C,S,A,J,B,I) \ (((F)<<31)|((C)<<27)|((S)<<24)|((A)<<21)|((J)<<16)|((B)<<12)|(I)) @@ -593,7 +591,6 @@ hyperfb_ioctl(void *v, void *vs, u_long return ret; } -#if 0 case WSDISPLAYIO_GCURPOS: { struct wsdisplay_curpos *cp = (void *)data; @@ -626,7 +623,6 @@ hyperfb_ioctl(void *v, void *vs, u_long return hyperfb_do_cursor(sc, cursor); } -#endif case WSDISPLAYIO_SVIDEO: hyperfb_set_video(sc, *(int *)data); @@ -860,18 +856,14 @@ hyperfb_setup(struct hyperfb_softc *sc) hyperfb_write4(sc, NGLE_REG_13, 0xffffffff); hyperfb_wait(sc); hyperfb_write4(sc, NGLE_REG_3, 0); - hyperfb_write4(sc, NGLE_REG_4, 0); - hyperfb_write4(sc, NGLE_REG_4, 0); hyperfb_write4(sc, NGLE_REG_4, 0x000000ff); /* BG */ hyperfb_write4(sc, NGLE_REG_4, 0x00ff0000); /* FG */ hyperfb_wait(sc); hyperfb_write4(sc, NGLE_REG_2, 0); - hyperfb_write4(sc, NGLE_REG_1, 0x80008004); + hyperfb_write4(sc, NGLE_REG_38, LBC_ENABLE | LBC_TYPE_CURSOR | 4); hyperfb_setup_fb(sc); - //hyperfb_write4(sc, NGLE_REG_29, 0x80200020); - - //hyperfb_move_cursor(sc, 100, 100); + hyperfb_move_cursor(sc, 100, 100); } @@ -889,9 +881,9 @@ hyperfb_set_video(struct hyperfb_softc * reg = hyperfb_read4(sc, NGLE_REG_33); if (on) { - hyperfb_write4(sc, NGLE_REG_33, reg | 0x0a000000); + hyperfb_write4(sc, NGLE_REG_33, reg | HCRX_VIDEO_ENABLE); } else { - hyperfb_write4(sc, NGLE_REG_33, reg & ~0x0a000000); + hyperfb_write4(sc, NGLE_REG_33, reg & ~HCRX_VIDEO_ENABLE); } } @@ -1151,3 +1143,158 @@ hyperfb_eraserows(void *cookie, int row, ri->ri_flg &= ~RI_CURSOR; } } + +static void +hyperfb_move_cursor(struct hyperfb_softc *sc, int x, int y) +{ + uint32_t pos; + + sc->sc_cursor_x = x; + x -= sc->sc_hot_x; + sc->sc_cursor_y = y; + y -= sc->sc_hot_y; + + if (x < 0) x = 0x1000 - x; + if (y < 0) y = 0x1000 - y; + pos = (x << 16) | y; + if (sc->sc_enabled) pos |= HCRX_ENABLE_CURSOR; + hyperfb_wait(sc); + hyperfb_write4(sc, NGLE_REG_29, pos); +} + +static int +hyperfb_do_cursor(struct hyperfb_softc *sc, struct wsdisplay_cursor *cur) +{ + + if (cur->which & WSDISPLAY_CURSOR_DOCUR) { + + sc->sc_enabled = cur->enable; + cur->which |= WSDISPLAY_CURSOR_DOPOS; + } + if (cur->which & WSDISPLAY_CURSOR_DOHOT) { + + sc->sc_hot_x = cur->hot.x; + sc->sc_hot_y = cur->hot.y; + cur->which |= WSDISPLAY_CURSOR_DOPOS; + } + if (cur->which & WSDISPLAY_CURSOR_DOPOS) { + + hyperfb_move_cursor(sc, cur->pos.x, cur->pos.y); + } + if (cur->which & WSDISPLAY_CURSOR_DOCMAP) { + uint32_t rgb; + uint8_t r[2], g[2], b[2]; + + copyin(cur->cmap.blue, b, 2); + copyin(cur->cmap.green, g, 2); + copyin(cur->cmap.red, r, 2); + mutex_enter(&sc->sc_hwlock); + hyperfb_wait(sc); + hyperfb_write4(sc, NGLE_REG_10, 0xBBE0F000); + hyperfb_write4(sc, NGLE_REG_14, 0x03000300); + hyperfb_write4(sc, NGLE_REG_13, 0xffffffff); + hyperfb_wait(sc); + hyperfb_write4(sc, NGLE_REG_3, 0); + rgb = (r[0] << 16) | (g[0] << 8) | b[0]; + hyperfb_write4(sc, NGLE_REG_4, rgb); /* BG */ + rgb = (r[1] << 16) | (g[1] << 8) | b[1]; + hyperfb_write4(sc, NGLE_REG_4, rgb); /* FG */ + hyperfb_write4(sc, NGLE_REG_2, 0); + hyperfb_write4(sc, NGLE_REG_38, LBC_ENABLE | LBC_TYPE_CURSOR | 4); + + hyperfb_setup_fb(sc); + mutex_exit(&sc->sc_hwlock); + + } + if (cur->which & WSDISPLAY_CURSOR_DOSHAPE) { + uint32_t buffer[128], latch, tmp; + int i; + + copyin(cur->mask, buffer, 512); + hyperfb_wait(sc); + hyperfb_write4(sc, NGLE_REG_30, 0); + for (i = 0; i < 128; i += 2) { + latch = 0; + tmp = buffer[i] & 0x80808080; + latch |= tmp >> 7; + tmp = buffer[i] & 0x40404040; + latch |= tmp >> 5; + tmp = buffer[i] & 0x20202020; + latch |= tmp >> 3; + tmp = buffer[i] & 0x10101010; + latch |= tmp >> 1; + tmp = buffer[i] & 0x08080808; + latch |= tmp << 1; + tmp = buffer[i] & 0x04040404; + latch |= tmp << 3; + tmp = buffer[i] & 0x02020202; + latch |= tmp << 5; + tmp = buffer[i] & 0x01010101; + latch |= tmp << 7; + hyperfb_write4(sc, NGLE_REG_31, latch); + latch = 0; + tmp = buffer[i + 1] & 0x80808080; + latch |= tmp >> 7; + tmp = buffer[i + 1] & 0x40404040; + latch |= tmp >> 5; + tmp = buffer[i + 1] & 0x20202020; + latch |= tmp >> 3; + tmp = buffer[i + 1] & 0x10101010; + latch |= tmp >> 1; + tmp = buffer[i + 1] & 0x08080808; + latch |= tmp << 1; + tmp = buffer[i + 1] & 0x04040404; + latch |= tmp << 3; + tmp = buffer[i + 1] & 0x02020202; + latch |= tmp << 5; + tmp = buffer[i + 1] & 0x01010101; + latch |= tmp << 7; + hyperfb_write4(sc, NGLE_REG_31, latch); + } + + copyin(cur->image, buffer, 512); + hyperfb_wait(sc); + hyperfb_write4(sc, NGLE_REG_30, 0x80); + for (i = 0; i < 128; i += 2) { + latch = 0; + tmp = buffer[i] & 0x80808080; + latch |= tmp >> 7; + tmp = buffer[i] & 0x40404040; + latch |= tmp >> 5; + tmp = buffer[i] & 0x20202020; + latch |= tmp >> 3; + tmp = buffer[i] & 0x10101010; + latch |= tmp >> 1; + tmp = buffer[i] & 0x08080808; + latch |= tmp << 1; + tmp = buffer[i] & 0x04040404; + latch |= tmp << 3; + tmp = buffer[i] & 0x02020202; + latch |= tmp << 5; + tmp = buffer[i] & 0x01010101; + latch |= tmp << 7; + hyperfb_write4(sc, NGLE_REG_31, latch); + latch = 0; + tmp = buffer[i + 1] & 0x80808080; + latch |= tmp >> 7; + tmp = buffer[i + 1] & 0x40404040; + latch |= tmp >> 5; + tmp = buffer[i + 1] & 0x20202020; + latch |= tmp >> 3; + tmp = buffer[i + 1] & 0x10101010; + latch |= tmp >> 1; + tmp = buffer[i + 1] & 0x08080808; + latch |= tmp << 1; + tmp = buffer[i + 1] & 0x04040404; + latch |= tmp << 3; + tmp = buffer[i + 1] & 0x02020202; + latch |= tmp << 5; + tmp = buffer[i + 1] & 0x01010101; + latch |= tmp << 7; + hyperfb_write4(sc, NGLE_REG_31, latch); + } + hyperfb_setup_fb(sc); + } + + return 0; +}