diff options
Diffstat (limited to 'sys/arch/hp300/dev/tvrx.c')
-rw-r--r-- | sys/arch/hp300/dev/tvrx.c | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/sys/arch/hp300/dev/tvrx.c b/sys/arch/hp300/dev/tvrx.c new file mode 100644 index 00000000000..0c65745917c --- /dev/null +++ b/sys/arch/hp300/dev/tvrx.c @@ -0,0 +1,207 @@ +/* $OpenBSD: tvrx.c,v 1.1 2006/04/14 21:05:43 miod Exp $ */ + +/* + * Copyright (c) 2006, Miodrag Vallat. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* + * Graphics routines for the TurboVRX frame buffer + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/conf.h> +#include <sys/device.h> +#include <sys/proc.h> +#include <sys/ioctl.h> + +#include <machine/autoconf.h> +#include <machine/bus.h> +#include <machine/cpu.h> + +#include <hp300/dev/dioreg.h> +#include <hp300/dev/diovar.h> +#include <hp300/dev/diodevs.h> + +#include <dev/cons.h> + +#include <dev/wscons/wsconsio.h> +#include <dev/wscons/wsdisplayvar.h> +#include <dev/rasops/rasops.h> + +#include <hp300/dev/diofbreg.h> +#include <hp300/dev/diofbvar.h> + +struct tvrx_softc { + struct device sc_dev; + struct diofb *sc_fb; + struct diofb sc_fb_store; + int sc_scode; +}; + +int tvrx_match(struct device *, void *, void *); +void tvrx_attach(struct device *, struct device *, void *); + +struct cfattach tvrx_ca = { + sizeof(struct tvrx_softc), tvrx_match, tvrx_attach +}; + +struct cfdriver tvrx_cd = { + NULL, "tvrx", DV_DULL +}; + +int tvrx_reset(struct diofb *, int, struct diofbreg *); + +int tvrx_ioctl(void *, u_long, caddr_t, int, struct proc *); + +struct wsdisplay_accessops tvrx_accessops = { + tvrx_ioctl, + diofb_mmap, + diofb_alloc_screen, + diofb_free_screen, + diofb_show_screen, + NULL, /* load_font */ + NULL, /* scrollback */ + NULL, /* getchar */ + NULL /* burner */ +}; + +/* + * Attachment glue + */ + +int +tvrx_match(struct device *parent, void *match, void *aux) +{ + struct dio_attach_args *da = aux; + + if (da->da_id != DIO_DEVICE_ID_FRAMEBUFFER || + da->da_secid != DIO_DEVICE_SECID_TIGERSHARK) + return (0); + + return (1); +} + +void +tvrx_attach(struct device *parent, struct device *self, void *aux) +{ + struct tvrx_softc *sc = (struct tvrx_softc *)self; + struct dio_attach_args *da = aux; + struct diofbreg *fbr; + + sc->sc_scode = da->da_scode; + if (sc->sc_scode == conscode) { + fbr = (struct diofbreg *)conaddr; /* already mapped */ + sc->sc_fb = &diofb_cn; + } else { + sc->sc_fb = &sc->sc_fb_store; + fbr = (struct diofbreg *) + iomap(dio_scodetopa(sc->sc_scode), da->da_size); + if (fbr == NULL || + tvrx_reset(sc->sc_fb, sc->sc_scode, fbr) != 0) { + printf(": can't map framebuffer\n"); + return; + } + } + + diofb_end_attach(sc, &tvrx_accessops, sc->sc_fb, + sc->sc_scode == conscode, NULL); +} + +/* + * Initialize hardware and display routines. + */ +int +tvrx_reset(struct diofb *fb, int scode, struct diofbreg *fbr) +{ + int rc; + + if ((rc = diofb_fbinquire(fb, scode, fbr)) != 0) + return (rc); + + /* + * We rely on the PROM to initialize the frame buffer in the mode + * we expect it: cleared, overlay plane enabled and accessible + * at the beginning of the video memory. + * + * This is NOT the mode we would end up by simply resetting the + * board. + */ + + fb->ri.ri_depth = 1; + fb->bmv = diofb_mono_windowmove; + diofb_fbsetup(fb); + + return (0); +} + +int +tvrx_ioctl(void *v, u_long cmd, caddr_t data, int flags, struct proc *p) +{ + struct diofb *fb = v; + struct wsdisplay_fbinfo *wdf; + + switch (cmd) { + case WSDISPLAYIO_GTYPE: + *(u_int *)data = WSDISPLAY_TYPE_TVRX; + break; + case WSDISPLAYIO_SMODE: + fb->mapmode = *(u_int *)data; + break; + case WSDISPLAYIO_GINFO: + wdf = (void *)data; + wdf->width = fb->ri.ri_width; + wdf->height = fb->ri.ri_height; + wdf->depth = fb->ri.ri_depth; + wdf->cmsize = 0; + break; + case WSDISPLAYIO_LINEBYTES: + *(u_int *)data = fb->ri.ri_stride; + break; + case WSDISPLAYIO_GETCMAP: + case WSDISPLAYIO_PUTCMAP: + break; /* until color support is implemented */ + case WSDISPLAYIO_GVIDEO: + case WSDISPLAYIO_SVIDEO: + /* unsupported */ + return (-1); + default: + return (-1); + } + + return (0); +} + +/* + * Console support + */ + +void +tvrxcninit() +{ + tvrx_reset(&diofb_cn, conscode, (struct diofbreg *)conaddr); + diofb_cnattach(&diofb_cn); +} |