Home | History | Annotate | Line # | Download | only in dev
fb.c revision 1.14
      1  1.14   thorpej /*	$NetBSD: fb.c,v 1.14 2002/10/02 04:27:52 thorpej Exp $	*/
      2   1.5    tsubai 
      3   1.5    tsubai /*-
      4   1.5    tsubai  * Copyright (c) 2000 Tsubai Masanari.  All rights reserved.
      5   1.1    tsubai  *
      6   1.1    tsubai  * Redistribution and use in source and binary forms, with or without
      7   1.1    tsubai  * modification, are permitted provided that the following conditions
      8   1.1    tsubai  * are met:
      9   1.1    tsubai  * 1. Redistributions of source code must retain the above copyright
     10   1.1    tsubai  *    notice, this list of conditions and the following disclaimer.
     11   1.1    tsubai  * 2. Redistributions in binary form must reproduce the above copyright
     12   1.1    tsubai  *    notice, this list of conditions and the following disclaimer in the
     13   1.1    tsubai  *    documentation and/or other materials provided with the distribution.
     14   1.5    tsubai  * 3. The name of the author may not be used to endorse or promote products
     15   1.5    tsubai  *    derived from this software without specific prior written permission.
     16   1.1    tsubai  *
     17   1.5    tsubai  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18   1.5    tsubai  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19   1.5    tsubai  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20   1.5    tsubai  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21   1.5    tsubai  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22   1.5    tsubai  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23   1.5    tsubai  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24   1.5    tsubai  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25   1.5    tsubai  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26   1.5    tsubai  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27   1.1    tsubai  */
     28   1.1    tsubai 
     29   1.1    tsubai #include <sys/param.h>
     30   1.1    tsubai #include <sys/device.h>
     31   1.5    tsubai #include <sys/ioctl.h>
     32   1.5    tsubai #include <sys/malloc.h>
     33   1.1    tsubai #include <sys/systm.h>
     34   1.1    tsubai 
     35   1.5    tsubai #include <uvm/uvm_extern.h>
     36   1.5    tsubai 
     37   1.5    tsubai #include <machine/adrsmap.h>
     38   1.1    tsubai #include <machine/autoconf.h>
     39   1.1    tsubai 
     40   1.5    tsubai #include <dev/wscons/wsconsio.h>
     41   1.5    tsubai #include <dev/wscons/wsdisplayvar.h>
     42   1.5    tsubai #include <dev/rasops/rasops.h>
     43   1.5    tsubai 
     44   1.5    tsubai struct fb_devconfig {
     45   1.5    tsubai 	u_char *dc_fbbase;		/* VRAM base address */
     46   1.5    tsubai 	struct rasops_info dc_ri;
     47   1.5    tsubai };
     48   1.1    tsubai 
     49   1.1    tsubai struct fb_softc {
     50   1.1    tsubai 	struct device sc_dev;
     51   1.5    tsubai 	struct fb_devconfig *sc_dc;
     52   1.5    tsubai 	int sc_nscreens;
     53   1.1    tsubai };
     54   1.1    tsubai 
     55   1.5    tsubai int fb_match(struct device *, struct cfdata *, void *);
     56   1.5    tsubai void fb_attach(struct device *, struct device *, void *);
     57   1.5    tsubai 
     58   1.5    tsubai int fb_common_init(struct fb_devconfig *);
     59   1.5    tsubai int fb_is_console(void);
     60   1.5    tsubai 
     61   1.5    tsubai int fb_ioctl(void *, u_long, caddr_t, int, struct proc *);
     62   1.5    tsubai paddr_t fb_mmap(void *, off_t, int);
     63   1.5    tsubai int fb_alloc_screen(void *, const struct wsscreen_descr *, void **, int *,
     64   1.5    tsubai 		    int *, long *);
     65   1.5    tsubai void fb_free_screen(void *, void *);
     66   1.5    tsubai int fb_show_screen(void *, void *, int, void (*)(void *, int, int), void *);
     67   1.5    tsubai 
     68   1.5    tsubai void fb_cnattach(void);
     69   1.5    tsubai 
     70   1.9      matt static void fb253_init(void);
     71   1.1    tsubai 
     72  1.14   thorpej CFATTACH_DECL(fb, sizeof(struct fb_softc),
     73  1.14   thorpej     fb_match, fb_attach, NULL, NULL);
     74   1.5    tsubai 
     75   1.5    tsubai struct fb_devconfig fb_console_dc;
     76   1.5    tsubai 
     77   1.5    tsubai struct wsdisplay_accessops fb_accessops = {
     78   1.5    tsubai 	fb_ioctl,
     79   1.5    tsubai 	fb_mmap,
     80   1.5    tsubai 	fb_alloc_screen,
     81   1.5    tsubai 	fb_free_screen,
     82   1.5    tsubai 	fb_show_screen,
     83   1.5    tsubai 	NULL	/* load_font */
     84   1.5    tsubai };
     85   1.5    tsubai 
     86   1.5    tsubai struct wsscreen_descr fb_stdscreen = {
     87   1.5    tsubai 	"std",
     88   1.5    tsubai 	0, 0,
     89   1.5    tsubai 	0,
     90   1.5    tsubai 	0, 0,
     91   1.5    tsubai 	WSSCREEN_REVERSE
     92   1.1    tsubai };
     93   1.1    tsubai 
     94   1.5    tsubai const struct wsscreen_descr *fb_scrlist[] = {
     95   1.5    tsubai 	&fb_stdscreen
     96   1.5    tsubai };
     97   1.5    tsubai 
     98   1.5    tsubai struct wsscreen_list fb_screenlist = {
     99   1.5    tsubai 	sizeof(fb_scrlist) / sizeof(fb_scrlist[0]), fb_scrlist
    100   1.5    tsubai };
    101   1.1    tsubai 
    102   1.5    tsubai #define NWB253_VRAM   ((u_char *) 0x88000000)
    103   1.5    tsubai #define NWB253_CTLREG ((u_short *)0xb8ff0000)
    104   1.5    tsubai #define NWB253_CRTREG ((u_short *)0xb8fe0000)
    105   1.1    tsubai 
    106   1.5    tsubai static char *devname[8] = { "NWB-512", "NWB-518", "NWE-501" };	/* XXX ? */
    107   1.5    tsubai 
    108   1.5    tsubai int
    109   1.5    tsubai fb_match(parent, match, aux)
    110   1.1    tsubai 	struct device *parent;
    111   1.5    tsubai 	struct cfdata *match;
    112   1.1    tsubai 	void *aux;
    113   1.1    tsubai {
    114   1.1    tsubai 	struct confargs *ca = aux;
    115   1.1    tsubai 
    116   1.5    tsubai 	if (strcmp(ca->ca_name, "fb") != 0)
    117   1.1    tsubai 		return 0;
    118   1.1    tsubai 
    119   1.5    tsubai 	if (badaddr(NWB253_CTLREG, 2) || badaddr(NWB253_CRTREG, 2))
    120   1.5    tsubai 		return 0;
    121   1.5    tsubai 	if ((*(volatile u_short *)NWB253_CTLREG & 7) != 4)
    122   1.1    tsubai 		return 0;
    123   1.1    tsubai 
    124   1.1    tsubai 	return 1;
    125   1.1    tsubai }
    126   1.1    tsubai 
    127   1.5    tsubai void
    128   1.5    tsubai fb_attach(parent, self, aux)
    129   1.5    tsubai 	struct device *parent, *self;
    130   1.1    tsubai 	void *aux;
    131   1.1    tsubai {
    132   1.5    tsubai 	struct fb_softc *sc = (void *)self;
    133   1.5    tsubai 	struct wsemuldisplaydev_attach_args waa;
    134   1.5    tsubai 	struct fb_devconfig *dc;
    135   1.5    tsubai 	struct rasops_info *ri;
    136   1.5    tsubai 	int console;
    137   1.5    tsubai 	volatile u_short *ctlreg = NWB253_CTLREG;
    138   1.5    tsubai 	int id;
    139   1.5    tsubai 
    140   1.5    tsubai 	console = fb_is_console();
    141   1.5    tsubai 
    142   1.5    tsubai 	if (console) {
    143   1.5    tsubai 		dc = &fb_console_dc;
    144   1.5    tsubai 		ri = &dc->dc_ri;
    145   1.5    tsubai 		sc->sc_nscreens = 1;
    146   1.5    tsubai 	} else {
    147   1.5    tsubai 		dc = malloc(sizeof(struct fb_devconfig), M_DEVBUF, M_WAITOK);
    148   1.5    tsubai 		bzero(dc, sizeof(struct fb_devconfig));
    149   1.5    tsubai 
    150   1.5    tsubai 		dc->dc_fbbase = NWB253_VRAM;
    151   1.5    tsubai 		fb_common_init(dc);
    152   1.5    tsubai 		ri = &dc->dc_ri;
    153   1.5    tsubai 
    154   1.5    tsubai 		/* clear screen */
    155   1.5    tsubai 		(*ri->ri_ops.eraserows)(ri, 0, ri->ri_rows, 0);
    156   1.5    tsubai 
    157   1.8    tsubai 		fb253_init();
    158   1.5    tsubai 	}
    159   1.5    tsubai 	sc->sc_dc = dc;
    160   1.5    tsubai 
    161   1.5    tsubai 	id = (*ctlreg >> 8) & 0xf;
    162   1.5    tsubai 	printf(": %s, %d x %d, %dbpp\n", devname[id],
    163   1.5    tsubai 	    ri->ri_width, ri->ri_height, ri->ri_depth);
    164   1.5    tsubai 
    165   1.5    tsubai 	waa.console = console;
    166   1.5    tsubai 	waa.scrdata = &fb_screenlist;
    167   1.5    tsubai 	waa.accessops = &fb_accessops;
    168   1.5    tsubai 	waa.accesscookie = sc;
    169   1.1    tsubai 
    170   1.5    tsubai 	config_found(self, &waa, wsemuldisplaydevprint);
    171   1.1    tsubai }
    172   1.1    tsubai 
    173   1.1    tsubai int
    174   1.5    tsubai fb_common_init(dc)
    175   1.5    tsubai 	struct fb_devconfig *dc;
    176   1.1    tsubai {
    177   1.5    tsubai 	struct rasops_info *ri = &dc->dc_ri;
    178   1.5    tsubai 	volatile u_short *ctlreg = NWB253_CTLREG;
    179   1.5    tsubai 	int id;
    180   1.5    tsubai 	int width, height, xoff, yoff, cols, rows;
    181   1.5    tsubai 
    182   1.5    tsubai 	id = (*ctlreg >> 8) & 0xf;
    183   1.5    tsubai 
    184   1.5    tsubai 	/* initialize rasops */
    185   1.5    tsubai 	switch (id) {
    186   1.5    tsubai 	case 0:
    187   1.5    tsubai 		width = 816;
    188   1.5    tsubai 		height = 1024;
    189   1.5    tsubai 		break;
    190   1.5    tsubai 	case 1:
    191   1.5    tsubai 	case 2:
    192   1.5    tsubai 		width = 1024;
    193   1.5    tsubai 		height = 768;
    194   1.5    tsubai 		break;
    195   1.1    tsubai 	}
    196   1.1    tsubai 
    197   1.5    tsubai 	ri->ri_width = width;
    198   1.5    tsubai 	ri->ri_height = height;
    199   1.5    tsubai 	ri->ri_depth = 1;
    200   1.5    tsubai 	ri->ri_stride = 2048 / 8;
    201   1.5    tsubai 	ri->ri_bits = dc->dc_fbbase;
    202   1.5    tsubai 	ri->ri_flg = RI_FULLCLEAR;
    203   1.5    tsubai 
    204   1.5    tsubai 	rasops_init(ri, 24, 80);
    205   1.5    tsubai 	rows = (height - 2) / ri->ri_font->fontheight;
    206   1.5    tsubai 	cols = ((width - 2) / ri->ri_font->fontwidth) & ~7;
    207   1.5    tsubai 	xoff = ((width - cols * ri->ri_font->fontwidth) / 2 / 8) & ~3;
    208   1.5    tsubai 	yoff = (height - rows * ri->ri_font->fontheight) / 2;
    209   1.5    tsubai 	rasops_reconfig(ri, rows, cols);
    210   1.5    tsubai 
    211   1.5    tsubai 	ri->ri_xorigin = xoff;
    212   1.5    tsubai 	ri->ri_yorigin = yoff;
    213   1.5    tsubai 	ri->ri_bits = dc->dc_fbbase + xoff + ri->ri_stride * yoff;
    214   1.5    tsubai 
    215   1.5    tsubai 	fb_stdscreen.nrows = ri->ri_rows;
    216   1.5    tsubai 	fb_stdscreen.ncols = ri->ri_cols;
    217   1.5    tsubai 	fb_stdscreen.textops = &ri->ri_ops;
    218   1.5    tsubai 	fb_stdscreen.capabilities = ri->ri_caps;
    219   1.1    tsubai 
    220   1.1    tsubai 	return 0;
    221   1.1    tsubai }
    222   1.1    tsubai 
    223   1.1    tsubai int
    224   1.5    tsubai fb_is_console()
    225   1.1    tsubai {
    226   1.5    tsubai 	volatile u_int *dipsw = (void *)DIP_SWITCH;
    227   1.1    tsubai 
    228   1.5    tsubai 	if (*dipsw & 7)					/* XXX right? */
    229   1.5    tsubai 		return 1;
    230   1.1    tsubai 
    231   1.1    tsubai 	return 0;
    232   1.1    tsubai }
    233   1.1    tsubai 
    234   1.1    tsubai int
    235   1.5    tsubai fb_ioctl(v, cmd, data, flag, p)
    236   1.5    tsubai 	void *v;
    237   1.1    tsubai 	u_long cmd;
    238   1.1    tsubai 	caddr_t data;
    239   1.5    tsubai 	int flag;
    240   1.1    tsubai 	struct proc *p;
    241   1.1    tsubai {
    242   1.5    tsubai 	struct fb_softc *sc = v;
    243   1.5    tsubai 	struct fb_devconfig *dc = sc->sc_dc;
    244   1.5    tsubai 	struct wsdisplay_fbinfo *wdf;
    245   1.1    tsubai 
    246   1.5    tsubai 	switch (cmd) {
    247   1.5    tsubai 	case WSDISPLAYIO_GTYPE:
    248   1.5    tsubai 		*(int *)data = WSDISPLAY_TYPE_UNKNOWN;	/* XXX */
    249   1.5    tsubai 		return 0;
    250   1.1    tsubai 
    251   1.5    tsubai 	case WSDISPLAYIO_GINFO:
    252   1.5    tsubai 		wdf = (void *)data;
    253   1.5    tsubai 		wdf->height = dc->dc_ri.ri_height;
    254   1.5    tsubai 		wdf->width = dc->dc_ri.ri_width;
    255   1.5    tsubai 		wdf->depth = dc->dc_ri.ri_depth;
    256   1.5    tsubai 		wdf->cmsize = 2;
    257   1.5    tsubai 		return 0;
    258   1.1    tsubai 
    259   1.5    tsubai 	case WSDISPLAYIO_SVIDEO:
    260   1.5    tsubai 		if (*(int *)data == WSDISPLAYIO_VIDEO_OFF) {
    261   1.5    tsubai 			volatile u_short *ctlreg = NWB253_CTLREG;
    262   1.5    tsubai 			*ctlreg = 0;			/* stop crtc */
    263   1.8    tsubai 		} else
    264   1.8    tsubai 			fb253_init();
    265   1.5    tsubai 		return 0;
    266   1.1    tsubai 
    267   1.5    tsubai 	case WSDISPLAYIO_GETCMAP:
    268   1.5    tsubai 	case WSDISPLAYIO_PUTCMAP:
    269  1.11   thorpej 		break;
    270   1.1    tsubai 	}
    271  1.10    atatat 	return EPASSTHROUGH;
    272   1.1    tsubai }
    273   1.1    tsubai 
    274   1.4    simonb paddr_t
    275   1.5    tsubai fb_mmap(v, offset, prot)
    276   1.5    tsubai 	void *v;
    277   1.5    tsubai 	off_t offset;
    278   1.4    simonb 	int prot;
    279   1.1    tsubai {
    280   1.5    tsubai 	struct fb_softc *sc = v;
    281   1.5    tsubai 	struct fb_devconfig *dc = sc->sc_dc;
    282   1.1    tsubai 
    283   1.6    tsubai 	if (offset >= 2048 * 2048 / 8 || offset < 0)
    284   1.1    tsubai 		return -1;
    285   1.1    tsubai 
    286   1.5    tsubai 	return mips_btop((int)dc->dc_fbbase + offset);
    287   1.5    tsubai }
    288   1.1    tsubai 
    289   1.5    tsubai int
    290   1.5    tsubai fb_alloc_screen(v, scrdesc, cookiep, ccolp, crowp, attrp)
    291   1.5    tsubai 	void *v;
    292   1.5    tsubai 	const struct wsscreen_descr *scrdesc;
    293   1.5    tsubai 	void **cookiep;
    294   1.5    tsubai 	int *ccolp, *crowp;
    295   1.5    tsubai 	long *attrp;
    296   1.5    tsubai {
    297   1.5    tsubai 	struct fb_softc *sc = v;
    298   1.5    tsubai 	struct rasops_info *ri = &sc->sc_dc->dc_ri;
    299   1.5    tsubai 	long defattr;
    300   1.5    tsubai 
    301   1.5    tsubai 	if (sc->sc_nscreens > 0)
    302   1.5    tsubai 		return ENOMEM;
    303   1.5    tsubai 
    304   1.5    tsubai 	*cookiep = ri;
    305   1.5    tsubai 	*ccolp = *crowp = 0;
    306  1.12  junyoung 	(*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr);
    307   1.5    tsubai 	*attrp = defattr;
    308   1.5    tsubai 	sc->sc_nscreens++;
    309   1.1    tsubai 
    310   1.5    tsubai 	return 0;
    311   1.1    tsubai }
    312   1.1    tsubai 
    313   1.5    tsubai void
    314   1.5    tsubai fb_free_screen(v, cookie)
    315   1.5    tsubai 	void *v;
    316   1.5    tsubai 	void *cookie;
    317   1.1    tsubai {
    318   1.5    tsubai 	struct fb_softc *sc = v;
    319   1.5    tsubai 
    320   1.5    tsubai 	if (sc->sc_dc == &fb_console_dc)
    321   1.5    tsubai 		panic("fb_free_screen: console");
    322   1.5    tsubai 
    323   1.5    tsubai 	sc->sc_nscreens--;
    324   1.1    tsubai }
    325   1.1    tsubai 
    326   1.5    tsubai int
    327   1.5    tsubai fb_show_screen(v, cookie, waitok, cb, cbarg)
    328   1.5    tsubai 	void *v;
    329   1.5    tsubai 	void *cookie;
    330   1.5    tsubai 	int waitok;
    331   1.5    tsubai 	void (*cb)(void *, int, int);
    332   1.5    tsubai 	void *cbarg;
    333   1.1    tsubai {
    334   1.5    tsubai 	return 0;
    335   1.1    tsubai }
    336   1.1    tsubai 
    337   1.5    tsubai void
    338   1.5    tsubai fb_cnattach()
    339   1.1    tsubai {
    340   1.5    tsubai 	struct fb_devconfig *dc = &fb_console_dc;
    341   1.5    tsubai 	struct rasops_info *ri = &dc->dc_ri;
    342   1.5    tsubai 	long defattr;
    343   1.5    tsubai 
    344   1.5    tsubai 	if (!fb_is_console())
    345   1.5    tsubai 		return;
    346   1.5    tsubai 
    347   1.5    tsubai 	dc->dc_fbbase = NWB253_VRAM;
    348   1.5    tsubai 	fb_common_init(dc);
    349   1.5    tsubai 
    350  1.12  junyoung 	(*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr);
    351   1.5    tsubai 	wsdisplay_cnattach(&fb_stdscreen, ri, 0, ri->ri_rows - 1, defattr);
    352   1.5    tsubai }
    353   1.5    tsubai 
    354   1.5    tsubai static u_char
    355   1.5    tsubai nwp512_data1[] = {
    356   1.5    tsubai 	0x00, 0x44,
    357   1.5    tsubai 	0x01, 0x33,
    358   1.5    tsubai 	0x02, 0x3c,
    359   1.5    tsubai 	0x03, 0x38,
    360   1.5    tsubai 	0x04, 0x84,
    361   1.5    tsubai 	0x05, 0x03,
    362   1.5    tsubai 	0x06, 0x80,
    363   1.5    tsubai 	0x07, 0x80,
    364   1.5    tsubai 	0x08, 0x10,
    365   1.5    tsubai 	0x09, 0x07,
    366   1.5    tsubai 	0x0a, 0x20,
    367   1.5    tsubai 	0x0c, 0x00,
    368   1.5    tsubai 	0x0d, 0x00,
    369   1.5    tsubai 	0x1b, 0x03
    370   1.5    tsubai };
    371   1.1    tsubai 
    372   1.5    tsubai static u_char
    373   1.5    tsubai nwp512_data2[] = {
    374   1.5    tsubai 	0x1e, 0x08,
    375   1.5    tsubai 	0x20, 0x08,
    376   1.5    tsubai 	0x21, 0x0d
    377   1.5    tsubai };
    378   1.1    tsubai 
    379   1.5    tsubai static u_char
    380   1.5    tsubai nwp518_data1[] = {
    381   1.5    tsubai 	0x00, 0x52,
    382   1.5    tsubai 	0x01, 0x40,
    383   1.5    tsubai 	0x02, 0x4a,
    384   1.5    tsubai 	0x03, 0x49,
    385   1.5    tsubai 	0x04, 0x63,
    386   1.5    tsubai 	0x05, 0x02,
    387   1.5    tsubai 	0x06, 0x60,
    388   1.5    tsubai 	0x07, 0x60,
    389   1.5    tsubai 	0x08, 0x10,
    390   1.5    tsubai 	0x09, 0x07,
    391   1.5    tsubai 	0x0a, 0x20,
    392   1.5    tsubai 	0x0c, 0x00,
    393   1.5    tsubai 	0x0d, 0x00,
    394   1.5    tsubai 	0x1b, 0x04
    395   1.5    tsubai };
    396   1.1    tsubai 
    397   1.5    tsubai static u_char
    398   1.5    tsubai nwp518_data2[] = {
    399   1.5    tsubai 	0x1e, 0x08,
    400   1.5    tsubai 	0x20, 0x00,
    401   1.5    tsubai 	0x21, 0x00
    402   1.5    tsubai };
    403   1.1    tsubai 
    404   1.5    tsubai static u_char
    405   1.5    tsubai nwe501_data1[] = {
    406   1.5    tsubai 	0x00, 0x4b,
    407   1.5    tsubai 	0x01, 0x40,
    408   1.5    tsubai 	0x02, 0x4a,
    409   1.5    tsubai 	0x03, 0x43,
    410   1.5    tsubai 	0x04, 0x64,
    411   1.5    tsubai 	0x05, 0x02,
    412   1.5    tsubai 	0x06, 0x60,
    413   1.5    tsubai 	0x07, 0x60,
    414   1.5    tsubai 	0x08, 0x10,
    415   1.5    tsubai 	0x09, 0x07,
    416   1.5    tsubai 	0x0a, 0x20,
    417   1.5    tsubai 	0x0c, 0x00,
    418   1.5    tsubai 	0x0d, 0x00,
    419   1.5    tsubai 	0x1b, 0x04
    420   1.5    tsubai };
    421   1.1    tsubai 
    422   1.5    tsubai static u_char
    423   1.5    tsubai nwe501_data2[] = {
    424   1.5    tsubai 	0x1e, 0x08,
    425   1.5    tsubai 	0x20, 0x00,
    426   1.5    tsubai 	0x21, 0x00
    427   1.5    tsubai };
    428   1.1    tsubai 
    429   1.5    tsubai static u_char
    430   1.5    tsubai *crtc_data[3][2] = {
    431   1.5    tsubai 	{ nwp512_data1, nwp512_data2 },
    432   1.5    tsubai 	{ nwp518_data1, nwp518_data2 },
    433   1.5    tsubai 	{ nwe501_data1, nwe501_data2 }
    434   1.5    tsubai };
    435   1.1    tsubai 
    436   1.1    tsubai static void
    437   1.9      matt fb253_init(void)
    438   1.1    tsubai {
    439   1.5    tsubai 	volatile u_short *ctlreg = NWB253_CTLREG;
    440   1.5    tsubai 	volatile u_short *crtreg = NWB253_CRTREG;
    441   1.8    tsubai 	int id = (*ctlreg >> 8) & 0xf;
    442   1.5    tsubai 	u_char *p;
    443   1.5    tsubai 	int i;
    444   1.5    tsubai 
    445   1.5    tsubai 	*ctlreg = 0;			/* stop crtc */
    446   1.5    tsubai 	delay(10);
    447   1.5    tsubai 
    448   1.5    tsubai 	/* initialize crtc without R3{0,1,2} */
    449   1.5    tsubai 	p = crtc_data[id][0];
    450   1.5    tsubai 	for (i = 0; i < 28; i++) {
    451   1.5    tsubai 		*crtreg++ = *p++;
    452   1.5    tsubai 		delay(10);
    453   1.5    tsubai 	}
    454   1.5    tsubai 
    455   1.5    tsubai 	*ctlreg = 0x02;			/* start crtc */
    456   1.5    tsubai 	delay(10);
    457   1.5    tsubai 
    458   1.5    tsubai 	/* set crtc control reg */
    459   1.5    tsubai 	p = crtc_data[id][1];
    460   1.5    tsubai 	for (i = 0; i < 6; i++) {
    461   1.5    tsubai 		*crtreg++ = *p++;
    462   1.5    tsubai 		delay(10);
    463   1.5    tsubai 	}
    464   1.5    tsubai }
    465   1.5    tsubai 
    466   1.5    tsubai #if 0
    467   1.5    tsubai static struct wsdisplay_font newsrom8x16;
    468   1.5    tsubai static struct wsdisplay_font newsrom12x24;
    469   1.5    tsubai static char fontarea16[96][32];
    470   1.5    tsubai static char fontarea24[96][96];
    471   1.5    tsubai 
    472   1.5    tsubai void
    473   1.5    tsubai initfont(ri)
    474   1.5    tsubai 	struct rasops_info *ri;
    475   1.5    tsubai {
    476   1.5    tsubai 	int c, x;
    477   1.5    tsubai 
    478   1.5    tsubai 	for (c = 0; c < 96; c++) {
    479   1.5    tsubai 		x = ((c & 0x1f) | ((c & 0xe0) << 2)) << 7;
    480   1.5    tsubai 		bcopy((char *)0xb8e00000 + x + 96, fontarea16 + c, 32);
    481   1.5    tsubai 		bcopy((char *)0xb8e00000 + x, fontarea24 + c, 96);
    482   1.5    tsubai 	}
    483   1.5    tsubai 
    484   1.5    tsubai 	newsrom8x16.name = "rom8x16";
    485   1.5    tsubai 	newsrom8x16.firstchar = 32;
    486   1.5    tsubai 	newsrom8x16.numchars = 96;
    487   1.5    tsubai 	newsrom8x16.encoding = WSDISPLAY_FONTENC_ISO;
    488   1.5    tsubai 	newsrom8x16.fontwidth = 8;
    489   1.5    tsubai 	newsrom8x16.fontheight = 16;
    490   1.5    tsubai 	newsrom8x16.stride = 2;
    491   1.5    tsubai 	newsrom8x16.bitorder = WSDISPLAY_FONTORDER_L2R;
    492   1.5    tsubai 	newsrom8x16.byteorder = WSDISPLAY_FONTORDER_L2R;
    493   1.5    tsubai 	newsrom8x16.data = fontarea16;
    494   1.5    tsubai 
    495   1.5    tsubai 	newsrom12x24.name = "rom12x24";
    496   1.5    tsubai 	newsrom12x24.firstchar = 32;
    497   1.5    tsubai 	newsrom12x24.numchars = 96;
    498   1.5    tsubai 	newsrom12x24.encoding = WSDISPLAY_FONTENC_ISO;
    499   1.5    tsubai 	newsrom12x24.fontwidth = 12;
    500   1.5    tsubai 	newsrom12x24.fontheight = 24;
    501   1.5    tsubai 	newsrom12x24.stride = 4;
    502   1.5    tsubai 	newsrom12x24.bitorder = WSDISPLAY_FONTORDER_L2R;
    503   1.5    tsubai 	newsrom12x24.byteorder = WSDISPLAY_FONTORDER_L2R;
    504   1.5    tsubai 	newsrom12x24.data = fontarea24;
    505   1.5    tsubai 
    506   1.5    tsubai 	ri->ri_font = &newsrom8x16;
    507   1.5    tsubai 	ri->ri_font = &newsrom12x24;
    508   1.5    tsubai 	ri->ri_wsfcookie = -1;		/* not using wsfont */
    509   1.1    tsubai }
    510   1.5    tsubai #endif
    511