diff options
Diffstat (limited to 'sys/arch/mac68k/dev')
-rw-r--r-- | sys/arch/mac68k/dev/macfb.c | 227 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/macfbvar.h | 12 |
2 files changed, 135 insertions, 104 deletions
diff --git a/sys/arch/mac68k/dev/macfb.c b/sys/arch/mac68k/dev/macfb.c index ea17513ae71..0fbb8eba267 100644 --- a/sys/arch/mac68k/dev/macfb.c +++ b/sys/arch/mac68k/dev/macfb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: macfb.c,v 1.1 2006/01/04 20:39:05 miod Exp $ */ +/* $OpenBSD: macfb.c,v 1.2 2006/01/08 16:36:54 miod Exp $ */ /* $NetBSD: macfb.c,v 1.11 2005/01/15 16:00:59 chs Exp $ */ /* * Copyright (c) 1998 Matt DeBergalis @@ -41,18 +41,17 @@ #include <mac68k/dev/nubus.h> #include <mac68k/dev/grfvar.h> -#include <mac68k/dev/macfbvar.h> #include <uvm/uvm_extern.h> #include <dev/wscons/wsconsio.h> - -#include <dev/rcons/raster.h> -#include <dev/wscons/wscons_raster.h> #include <dev/wscons/wsdisplayvar.h> +#include <dev/rasops/rasops.h> -int macfb_match(struct device *, void *, void *); -void macfb_attach(struct device *, struct device *, void *); +#include <mac68k/dev/macfbvar.h> + +int macfb_match(struct device *, void *, void *); +void macfb_attach(struct device *, struct device *, void *); struct cfattach macfb_ca = { sizeof(struct macfb_softc), macfb_match, macfb_attach @@ -62,34 +61,6 @@ struct cfdriver macfb_cd = { NULL, "macfb", DV_DULL }; -const struct wsdisplay_emulops macfb_emulops = { - rcons_cursor, - rcons_mapchar, - rcons_putchar, - rcons_copycols, - rcons_erasecols, - rcons_copyrows, - rcons_eraserows, - rcons_alloc_attr -}; - -struct wsscreen_descr macfb_stdscreen = { - "std", - 0, 0, /* will be filled in -- XXX shouldn't, it's global */ - &macfb_emulops, - 0, 0, - WSSCREEN_REVERSE -}; - -const struct wsscreen_descr *_macfb_scrlist[] = { - &macfb_stdscreen, -}; - -const struct wsscreen_list macfb_screenlist = { - sizeof(_macfb_scrlist) / sizeof(struct wsscreen_descr *), - _macfb_scrlist -}; - int macfb_ioctl(void *, u_long, caddr_t, int, struct proc *); paddr_t macfb_mmap(void *, off_t, int); int macfb_alloc_screen(void *, const struct wsscreen_descr *, @@ -110,10 +81,11 @@ const struct wsdisplay_accessops macfb_accessops = { NULL /* burner */ }; -void macfb_init(struct macfb_devconfig *); +int macfb_alloc_attr(void *, int, int, int, long *); +int macfb_init(struct macfb_devconfig *); +int macfb_is_console(paddr_t); paddr_t macfb_consaddr; -static int macfb_is_console(paddr_t); static struct macfb_devconfig macfb_console_dc; @@ -126,7 +98,7 @@ extern u_int32_t mac68k_vidlog; extern u_int32_t mac68k_vidphys; extern u_int32_t mac68k_vidlen; -static int +int macfb_is_console(paddr_t addr) { if (addr != macfb_consaddr && @@ -146,43 +118,85 @@ macfb_is_console(paddr_t addr) && (addr == macfb_consaddr)); } -void -macfb_clear(struct macfb_devconfig *dc) +int +macfb_init(struct macfb_devconfig *dc) { - int i, rows; + struct rasops_info *ri = &dc->dc_ri; + extern int rasops_alloc_cattr(void *, int, int, int, long *); + + /* + * Clear display. We can't pass RI_CLEAR in ri_flg and have rasops + * do it for us until we know how to setup the colormap first. + */ + memset((char *)dc->dc_vaddr + dc->dc_offset, + dc->dc_depth <= 8 ? 0xff : 0, dc->dc_rowbytes * dc->dc_ht); + + bzero(ri, sizeof(*ri)); + ri->ri_depth = dc->dc_depth; + ri->ri_stride = dc->dc_rowbytes; + ri->ri_flg = RI_CENTER; + ri->ri_bits = (void *)(dc->dc_vaddr + dc->dc_offset); + ri->ri_width = dc->dc_wid; + ri->ri_height = dc->dc_ht; + ri->ri_hw = dc; + + /* + * Ask for an unholy big display, rasops will trim this to more + * reasonable values. + */ + if (rasops_init(ri, 160, 160) != 0) + return (-1); + + /* + * Until we know how to setup the colormap, constrain ourselves to + * mono mode. Note that we need to use our own alloc_attr routine + * to compensate for inverted black and white colors. + */ + ri->ri_ops.alloc_attr = macfb_alloc_attr; + ri->ri_caps &= ~(WSSCREEN_WSCOLORS | WSSCREEN_HILIT); + if (ri->ri_depth == 8) + ri->ri_devcmap[15] = 0xffffffff; + + strlcpy(dc->wsd.name, "std", sizeof(dc->wsd.name)); + dc->wsd.ncols = ri->ri_cols; + dc->wsd.nrows = ri->ri_rows; + dc->wsd.textops = &ri->ri_ops; + dc->wsd.fontwidth = ri->ri_font->fontwidth; + dc->wsd.fontheight = ri->ri_font->fontheight; + dc->wsd.capabilities = ri->ri_caps; - /* clear the display */ - rows = dc->dc_ht; - for (i = 0; rows-- > 0; i += dc->dc_rowbytes) - memset((u_char *)dc->dc_vaddr + dc->dc_offset + i, - 0, dc->dc_rowbytes); + return (0); } -void -macfb_init(struct macfb_devconfig *dc) +int +macfb_alloc_attr(void *cookie, int fg, int bg, int flg, long *attr) { - struct raster *rap; - struct rcons *rcp; - - macfb_clear(dc); - - rap = &dc->dc_raster; - rap->width = dc->dc_wid; - rap->height = dc->dc_ht; - rap->depth = dc->dc_depth; - rap->linelongs = dc->dc_rowbytes / sizeof(u_int32_t); - rap->pixels = (u_int32_t *)(dc->dc_vaddr + dc->dc_offset); - - /* initialize the raster console blitter */ - rcp = &dc->dc_rcons; - rcp->rc_sp = rap; - rcp->rc_crow = rcp->rc_ccol = -1; - rcp->rc_crowp = &rcp->rc_crow; - rcp->rc_ccolp = &rcp->rc_ccol; - rcons_init(rcp, 128, 192); - - macfb_stdscreen.nrows = dc->dc_rcons.rc_maxrow; - macfb_stdscreen.ncols = dc->dc_rcons.rc_maxcol; + struct rasops_info *ri = cookie; + int swap; + + if ((flg & (WSATTR_BLINK | WSATTR_HILIT | WSATTR_WSCOLORS)) != 0) + return (EINVAL); + + /* + * Default values are white on black. However, on indexed displays, + * 0 is white and all bits set is black. + */ + if (ri->ri_depth <= 8) { + fg = 0; + bg = 15; + } else { + bg = WSCOL_BLACK; + fg = WSCOL_WHITE; + } + + if ((flg & WSATTR_REVERSE) != 0) { + swap = fg; + fg = bg; + bg = swap; + } + + *attr = (bg << 16) | (fg << 24) | ((flg & WSATTR_UNDERLINE) ? 7 : 6); + return (0); } int @@ -198,6 +212,8 @@ macfb_attach(struct device *parent, struct device *self, void *aux) struct grfmode *gm = ga->ga_grfmode; struct macfb_softc *sc; struct wsemuldisplaydev_attach_args waa; + struct wsscreen_descr *scrlist[1]; + struct wsscreen_list screenlist; int isconsole; sc = (struct macfb_softc *)self; @@ -211,9 +227,10 @@ macfb_attach(struct device *parent, struct device *self, void *aux) if (isconsole) { sc->sc_dc = &macfb_console_dc; - sc->nscreens = 1; + sc->sc_dc->nscreens = 1; } else { - sc->sc_dc = malloc(sizeof(struct macfb_devconfig), M_DEVBUF, M_WAITOK); + sc->sc_dc = malloc(sizeof(struct macfb_devconfig), + M_DEVBUF, M_WAITOK); sc->sc_dc->dc_vaddr = (vaddr_t)gm->fbbase; sc->sc_dc->dc_paddr = ga->ga_phys; sc->sc_dc->dc_size = gm->fbsize; @@ -224,14 +241,18 @@ macfb_attach(struct device *parent, struct device *self, void *aux) sc->sc_dc->dc_rowbytes = gm->rowbytes; sc->sc_dc->dc_offset = gm->fboff; + sc->sc_dc->nscreens = 0; - macfb_init(sc->sc_dc); - - sc->nscreens = 0; + if (macfb_init(sc->sc_dc) != 0) + return; } + scrlist[0] = &sc->sc_dc->wsd; + screenlist.nscreens = 1; + screenlist.screens = (const struct wsscreen_descr **)scrlist; + waa.console = isconsole; - waa.scrdata = &macfb_screenlist; + waa.scrdata = &screenlist; waa.accessops = &macfb_accessops; waa.accesscookie = sc; @@ -253,14 +274,14 @@ macfb_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p) case WSDISPLAYIO_GINFO: wdf = (struct wsdisplay_fbinfo *)data; - wdf->height = dc->dc_raster.height; - wdf->width = dc->dc_raster.width; - wdf->depth = dc->dc_raster.depth; + wdf->height = dc->dc_ri.ri_height; + wdf->width = dc->dc_ri.ri_width; + wdf->depth = dc->dc_ri.ri_depth; wdf->cmsize = 0; /* until we can change it... */ break; case WSDISPLAYIO_LINEBYTES: - *(u_int *)data = dc->dc_rowbytes; + *(u_int *)data = dc->dc_ri.ri_stride; break; case WSDISPLAYIO_GVIDEO: @@ -294,17 +315,22 @@ macfb_alloc_screen(void *v, const struct wsscreen_descr *type, void **cookiep, int *curxp, int *curyp, long *defattrp) { struct macfb_softc *sc = v; - long defattr; + struct rasops_info *ri = &sc->sc_dc->dc_ri; - if (sc->nscreens > 0) + if (sc->sc_dc->nscreens > 0) return (ENOMEM); - *cookiep = &sc->sc_dc->dc_rcons; /* one and only for now */ - *curxp = 0; - *curyp = 0; - rcons_alloc_attr(&sc->sc_dc->dc_rcons, 0, 0, 0, &defattr); - *defattrp = defattr; - sc->nscreens++; + *cookiep = ri; + *curxp = *curyp = 0; +#ifdef notyet + if ((ri->ri_caps & WSSCREEN_WSCOLORS) && ri->ri_depth <= 8) + ri->ri_ops.alloc_attr(ri, WSCOL_WHITE, WSCOL_BLACK, + WSATTR_WSCOLORS, defattrp); + else +#endif + ri->ri_ops.alloc_attr(ri, 0, 0, 0, defattrp); + sc->sc_dc->nscreens++; + return (0); } @@ -313,19 +339,14 @@ macfb_free_screen(void *v, void *cookie) { struct macfb_softc *sc = v; -#ifdef DIAGNOSTIC - if (sc->sc_dc == &macfb_console_dc) - panic("cfb_free_screen: console"); -#endif - - sc->nscreens--; + sc->sc_dc->nscreens--; } int macfb_show_screen(void *v, void *cookie, int waitok, void (*cb)(void *, int, int), void *cbarg) { - return 0; + return (0); } int @@ -333,6 +354,7 @@ macfb_cnattach(paddr_t addr) { struct macfb_devconfig *dc = &macfb_console_dc; long defattr; + struct rasops_info *ri; dc->dc_vaddr = trunc_page(videoaddr); dc->dc_paddr = trunc_page(mac68k_vidphys); @@ -347,12 +369,19 @@ macfb_cnattach(paddr_t addr) dc->dc_offset = m68k_page_offset(mac68k_vidphys); /* set up the display */ - macfb_init(&macfb_console_dc); + if (macfb_init(dc) != 0) + return (-1); - rcons_alloc_attr(&dc->dc_rcons, 0, 0, 0, &defattr); + ri = &dc->dc_ri; +#ifdef notyet + if ((ri->ri_caps & WSSCREEN_WSCOLORS) && ri->ri_depth <= 8) + ri->ri_ops.alloc_attr(ri, WSCOL_WHITE, WSCOL_BLACK, + WSATTR_WSCOLORS, &defattr); + else +#endif + ri->ri_ops.alloc_attr(ri, 0, 0, 0, &defattr); - wsdisplay_cnattach(&macfb_stdscreen, &dc->dc_rcons, - 0, 0, defattr); + wsdisplay_cnattach(&dc->wsd, ri, 0, 0, defattr); macfb_consaddr = addr; return (0); diff --git a/sys/arch/mac68k/dev/macfbvar.h b/sys/arch/mac68k/dev/macfbvar.h index 3dd0765a853..7ea6e623503 100644 --- a/sys/arch/mac68k/dev/macfbvar.h +++ b/sys/arch/mac68k/dev/macfbvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: macfbvar.h,v 1.1 2006/01/04 20:39:05 miod Exp $ */ +/* $OpenBSD: macfbvar.h,v 1.2 2006/01/08 16:36:54 miod Exp $ */ /* $NetBSD: macfbvar.h,v 1.3 2005/01/15 16:00:59 chs Exp $ */ /* * Copyright (c) 1998 Matt DeBergalis @@ -47,16 +47,18 @@ struct macfb_devconfig { int dc_depth; /* depth of frame buffer */ int dc_rowbytes; /* bytes in fb scan line */ - struct raster dc_raster; /* raster description */ - struct rcons dc_rcons; /* raster blitter control info */ + /* rasops information */ + struct rasops_info dc_ri; + + /* wsdisplay information */ + struct wsscreen_descr wsd; + int nscreens; }; struct macfb_softc { struct device sc_dev; - int nscreens; struct macfb_devconfig *sc_dc; }; int macfb_cnattach(paddr_t); -void macfb_clear(struct macfb_devconfig *); |