xref: /csrg-svn/sys/news3400/fb/fbbm_253.c (revision 63260)
157172Sutashiro /*
2*63260Sbostic  * Copyright (c) 1992, 1993
3*63260Sbostic  *	The Regents of the University of California.  All rights reserved.
457172Sutashiro  *
557172Sutashiro  * This code is derived from software contributed to Berkeley by
657172Sutashiro  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
757172Sutashiro  *
857172Sutashiro  * %sccs.include.redist.c%
957172Sutashiro  *
1057605Sutashiro  * from: $Hdr: fbbm_253.c,v 4.300 91/06/09 06:33:12 root Rel41 $ SONY;
1157172Sutashiro  *
12*63260Sbostic  *	@(#)fbbm_253.c	8.1 (Berkeley) 06/11/93
1357172Sutashiro  */
1457172Sutashiro 
1557172Sutashiro /*
1657172Sutashiro  * NWB-253 frame buffer driver
1757172Sutashiro  */
1857172Sutashiro 
1957172Sutashiro #include "nwb253.h"
2057172Sutashiro 
2157172Sutashiro #if NNWB253 > 0
2257178Sutashiro #include <sys/param.h>
2357178Sutashiro #include <news3400/iop/framebuf.h>
2457178Sutashiro #include <news3400/iop/fbreg.h>
2557172Sutashiro 
2657178Sutashiro #include <news3400/fb/fbdefs.h>
2757172Sutashiro 
2857172Sutashiro extern int error();
2957172Sutashiro extern int nofunc();
3057172Sutashiro extern char *ext_fnt24_addr[];
3157172Sutashiro extern char *ext_fnt_addr[];
3257172Sutashiro 
3357172Sutashiro extern short zero[];
3457172Sutashiro 
3557172Sutashiro #define NOP		{ int j; for (j = 0; j < 40; j++); }
3657172Sutashiro 
3757172Sutashiro #define	VRAM_START	(unsigned int *)(0x88000000)
3857172Sutashiro #define VRAM_WIDTH	(2048/32)
3957172Sutashiro 
4060002Sutashiro void
nwb253attach(i)4160002Sutashiro nwb253attach(i)
4260002Sutashiro {
4360002Sutashiro 	/* temporary hack for pseudo-device initialization */;
4460002Sutashiro }
4560002Sutashiro 
4657172Sutashiro static caddr_t
fb253_Krom_addr(fb,c,sr)4757172Sutashiro fb253_Krom_addr(fb, c, sr)
4857172Sutashiro 	struct fbdev *fb;
4957172Sutashiro 	register int c;
5057172Sutashiro 	lRectangle *sr;
5157172Sutashiro {
5257172Sutashiro 	unsigned int cvcode16();
5357172Sutashiro 
5457172Sutashiro 	if ((c >= 0x20) && (c <= 0x7e)) {
5557172Sutashiro 		/*
5657172Sutashiro 		 * ASCII char
5757172Sutashiro 		 */
5857172Sutashiro 		c -= ' ';
5957172Sutashiro 		c = ((c & 0x1f) | ((c & 0xe0) << 2)) << 7;
6057172Sutashiro 		return (caddr_t)(c + fb->Krom_base + (sr->extent.y > 16 ? 0 : 96));
6157172Sutashiro 	} else if ((c >= 0xa1) && (c <= 0xdf)) {
6257172Sutashiro 		/*
6357172Sutashiro 		 * KANA char
6457172Sutashiro 		 */
6557172Sutashiro 		if (sr->extent.y > 16)
6657172Sutashiro 			return ((caddr_t)ext_fnt24_addr[c + 64]);
6757172Sutashiro 		else
6857172Sutashiro 			return ((caddr_t)ext_fnt_addr[c + 64]);
6957172Sutashiro 	} else if ((c >= 0x2020) && (c <= 0x7e7e)) {
7057172Sutashiro 		/*
7157172Sutashiro 		 * KANJI char
7257172Sutashiro 		 */
7357172Sutashiro 		switch (c & 0x7000) {
7457172Sutashiro 		case 0x2000:
7557172Sutashiro 			c = ((c&0x1f)|((c&0x60)<<5)|((c&0x700)>>1))<<7;
7657172Sutashiro 			break;
7757172Sutashiro 		case 0x3000:
7857172Sutashiro 		case 0x4000:
7957172Sutashiro 			c = ((c&0x7f)|((c&0xf00)>>1)|((c&0x4000)>>3))<<7;
8057172Sutashiro 			break;
8157172Sutashiro 		case 0x5000:
8257172Sutashiro 		case 0x6000:
8357172Sutashiro 			c = ((c&0x7f)|((c&0xf00)>>1)|((c&0x2000)>>2)|0x1000)<<7;
8457172Sutashiro 			break;
8557172Sutashiro 		case 0x7000:
8657172Sutashiro 			c = ((c&0x1f)|((c&0x60)<<5)|((c&0x700)>>1)|0x1000)<<7;
8757172Sutashiro 			break;
8857172Sutashiro 		}
8957172Sutashiro 		return (caddr_t)(c + fb->Krom_base + (sr->extent.y > 16 ? 0 : 96));
9057172Sutashiro 	} else {
9157172Sutashiro 		/*
9257172Sutashiro 		 * UNKNOWN char
9357172Sutashiro 		 */
9457172Sutashiro 		return (caddr_t)zero;
9557172Sutashiro 	}
9657172Sutashiro }
9757172Sutashiro 
9857172Sutashiro static int
fb253_set_dimmer(fb,dim)9957172Sutashiro fb253_set_dimmer(fb, dim)
10057172Sutashiro 	struct fbdev *fb;
10157172Sutashiro 	int dim;
10257172Sutashiro {
10357172Sutashiro 	int s;
10457172Sutashiro 
10557172Sutashiro 	fb->status_flag = (fb->status_flag & 0xf3) | ((dim & 3) << 2);
10657172Sutashiro 	*(volatile u_short *)(0xb8ff0000) = fb->status_flag;
10757172Sutashiro 
10857172Sutashiro 	return (FB_ROK);
10957172Sutashiro }
11057172Sutashiro 
11157172Sutashiro static int
fb253_get_dimmer(fb)11257172Sutashiro fb253_get_dimmer(fb)
11357172Sutashiro 	struct fbdev *fb;
11457172Sutashiro {
11557172Sutashiro 	int dim;
11657172Sutashiro 
11757172Sutashiro 	dim = (fb->status_flag >> 2) & 3;
11857172Sutashiro 	return (dim);
11957172Sutashiro }
12057172Sutashiro 
12157172Sutashiro int
fb253_get_pixel(fb,pixel)12257172Sutashiro fb253_get_pixel(fb, pixel)
12357172Sutashiro 	struct fbdev *fb;
12457172Sutashiro 	register int pixel;
12557172Sutashiro {
12657172Sutashiro 	return (pixel);
12757172Sutashiro }
12857172Sutashiro 
12957172Sutashiro fb253_ioctl(fb, cmd, data)
13057172Sutashiro 	struct fbdev *fb;
13157172Sutashiro 	int cmd;
13257172Sutashiro 	int *data;
13357172Sutashiro {
13457172Sutashiro 	register int result = 0;
13557172Sutashiro 
13657172Sutashiro 	switch (cmd) {
13757172Sutashiro 	case FB_INTCHECK:
13857172Sutashiro 		if (*(volatile u_short *)(0xb8ff0000) & 0x08)
13957172Sutashiro 			result |= FB_INT_VSYNC;
14057172Sutashiro 		break;
14157172Sutashiro 	case FB_INTENABLE:
14257172Sutashiro 		if (*data & FB_INT_VSYNC) {
14357172Sutashiro 			fb->status_flag |= 1;
14457172Sutashiro 			*(volatile u_short *)(0xb8ff0000) = fb->status_flag;
14557172Sutashiro 			WB_FLUSH;
14657172Sutashiro 		}
14757172Sutashiro 		break;
14857172Sutashiro 	case FB_INTCLEAR:
14957172Sutashiro 		if (*data & FB_INT_VSYNC) {
15057172Sutashiro 			fb->status_flag &= ~1;
15157172Sutashiro 			*(volatile u_short *)(0xb8ff0000) = fb->status_flag;
15257172Sutashiro 			WB_FLUSH;
15357172Sutashiro 		}
15457172Sutashiro 		break;
15557172Sutashiro 	case FB_STATUSCHECK:
15657172Sutashiro 		break;
15757172Sutashiro 	default:
15857172Sutashiro 		result = -1;
15957172Sutashiro 	}
16057172Sutashiro 	return (result);
16157172Sutashiro }
16257172Sutashiro 
16357172Sutashiro int
fb253_get_page(fb,off)16457172Sutashiro fb253_get_page(fb, off)
16557172Sutashiro 	struct fbdev *fb;
16657172Sutashiro 	off_t off;
16757172Sutashiro {
16857172Sutashiro 	if (off < 2048/8 * 2048)		/* X/8 * Y */
16957172Sutashiro 		return (((unsigned int)0x8000000 + off) >> PGSHIFT);
17057172Sutashiro 	else
17157172Sutashiro 		return (-1);
17257172Sutashiro }
17357172Sutashiro 
17457172Sutashiro int
fb253_probe(unit)17557172Sutashiro fb253_probe(unit)
17657172Sutashiro 	int unit;
17757172Sutashiro {
17857172Sutashiro 	if (unit >= NNWB253)
17957172Sutashiro 		return 0;
18057172Sutashiro 	if (badaddr(0xb8ff0000, 2) || badaddr(0xb8e00000, 2))
18157172Sutashiro 		return 0;
18257172Sutashiro 	if ((*(volatile u_short *)(0xb8ff0000) & 7) == 4)
18357172Sutashiro 		return FB_NWB253;
18457172Sutashiro 	return 0;
18557172Sutashiro }
18657172Sutashiro 
18757172Sutashiro void fbmem_rop_init();
18857172Sutashiro void fbmem_rop_copy();
18957172Sutashiro void fbmem_rop_winit();
19057172Sutashiro void fbmem_rop_write();
19157172Sutashiro void fbmem_rop_read();
19257172Sutashiro void fbmem_rop_cinit();
19357172Sutashiro void fbmem_rop_clear();
19457172Sutashiro void fbmem_rop_vect();
19557172Sutashiro void fbmem_rop_dot();
19657172Sutashiro 
19757172Sutashiro static struct fbdev_ops
19857172Sutashiro fb253_ops = {
19957172Sutashiro 	fbmem_rop_init,
20057172Sutashiro 	fbmem_rop_copy,
20157172Sutashiro 	fbmem_rop_winit,
20257172Sutashiro 	fbmem_rop_write,
20357172Sutashiro 	fbmem_rop_read,
20457172Sutashiro 	fbmem_rop_cinit,
20557172Sutashiro 	fbmem_rop_clear,
20657172Sutashiro 	fbmem_rop_vect,
20757172Sutashiro 	fbmem_rop_dot,
20857172Sutashiro 	(void (*)())nofunc,
20957172Sutashiro 	(void (*)())error,
21057172Sutashiro 	(void (*)())error,
21157172Sutashiro 	fb253_Krom_addr,
21257172Sutashiro 	(void (*)())error,
21357172Sutashiro 	error,
21457172Sutashiro 	error,
21557172Sutashiro 	fb253_get_pixel,
21657172Sutashiro 	fb253_set_dimmer,
21757172Sutashiro 	fb253_get_dimmer,
21857172Sutashiro 	nofunc,
21957172Sutashiro 	nofunc,
22057172Sutashiro 	fb253_ioctl,
22157172Sutashiro 	fb253_get_page,
22257172Sutashiro 	(void (*)())nofunc,
22357172Sutashiro 	(void (*)())nofunc,
22457172Sutashiro 	(void (*)())nofunc,
22557172Sutashiro 	(void (*)())nofunc,
22657172Sutashiro };
22757172Sutashiro 
22857172Sutashiro static u_short
22957172Sutashiro nwp512_data1[] = {
23057172Sutashiro 	0x00, 0x44,
23157172Sutashiro 	0x01, 0x33,
23257172Sutashiro 	0x02, 0x3c,
23357172Sutashiro 	0x03, 0x38,
23457172Sutashiro 	0x04, 0x84,
23557172Sutashiro 	0x05, 0x03,
23657172Sutashiro 	0x06, 0x80,
23757172Sutashiro 	0x07, 0x80,
23857172Sutashiro 	0x08, 0x10,
23957172Sutashiro 	0x09, 0x07,
24057172Sutashiro 	0x0a, 0x20,
24157172Sutashiro 	0x0c, 0x00,
24257172Sutashiro 	0x0d, 0x00,
24357172Sutashiro 	0x1b, 0x03
24457172Sutashiro };
24557172Sutashiro 
24657172Sutashiro static u_short
24757172Sutashiro nwp512_data2[] = {
24857172Sutashiro 	0x1e, 0x08,
24957172Sutashiro 	0x20, 0x08,
25057172Sutashiro 	0x21, 0x0d
25157172Sutashiro };
25257172Sutashiro 
25357172Sutashiro static u_short
25457172Sutashiro nwp518_data1[] = {
25557172Sutashiro 	0x00, 0x52,
25657172Sutashiro 	0x01, 0x40,
25757172Sutashiro 	0x02, 0x4a,
25857172Sutashiro 	0x03, 0x49,
25957172Sutashiro 	0x04, 0x63,
26057172Sutashiro 	0x05, 0x02,
26157172Sutashiro 	0x06, 0x60,
26257172Sutashiro 	0x07, 0x60,
26357172Sutashiro 	0x08, 0x10,
26457172Sutashiro 	0x09, 0x07,
26557172Sutashiro 	0x0a, 0x20,
26657172Sutashiro 	0x0c, 0x00,
26757172Sutashiro 	0x0d, 0x00,
26857172Sutashiro 	0x1b, 0x04
26957172Sutashiro };
27057172Sutashiro 
27157172Sutashiro static u_short
27257172Sutashiro nwp518_data2[] = {
27357172Sutashiro 	0x1e, 0x08,
27457172Sutashiro 	0x20, 0x00,
27557172Sutashiro 	0x21, 0x00
27657172Sutashiro };
27757172Sutashiro 
27857172Sutashiro static u_short
27957172Sutashiro nwe501_data1[] = {
28057172Sutashiro 	0x00, 0x4b,
28157172Sutashiro 	0x01, 0x40,
28257172Sutashiro 	0x02, 0x4a,
28357172Sutashiro 	0x03, 0x43,
28457172Sutashiro 	0x04, 0x64,
28557172Sutashiro 	0x05, 0x02,
28657172Sutashiro 	0x06, 0x60,
28757172Sutashiro 	0x07, 0x60,
28857172Sutashiro 	0x08, 0x10,
28957172Sutashiro 	0x09, 0x07,
29057172Sutashiro 	0x0a, 0x20,
29157172Sutashiro 	0x0c, 0x00,
29257172Sutashiro 	0x0d, 0x00,
29357172Sutashiro 	0x1b, 0x04
29457172Sutashiro };
29557172Sutashiro 
29657172Sutashiro static u_short
29757172Sutashiro nwe501_data2[] = {
29857172Sutashiro 	0x1e, 0x08,
29957172Sutashiro 	0x20, 0x00,
30057172Sutashiro 	0x21, 0x00
30157172Sutashiro };
30257172Sutashiro 
30357172Sutashiro static u_short
30457172Sutashiro *crtc_data[3][2] = {
30557172Sutashiro 	nwp512_data1, nwp512_data2,
30657172Sutashiro 	nwp518_data1, nwp518_data2,
30757172Sutashiro 	nwe501_data1, nwe501_data2,
30857172Sutashiro };
30957172Sutashiro 
31057172Sutashiro static void
fb253_init(fb,id)31157172Sutashiro fb253_init(fb, id)
31257172Sutashiro 	struct fbdev *fb;
31357172Sutashiro 	int id;
31457172Sutashiro {
31557172Sutashiro 	register int i;
31657172Sutashiro 	register volatile u_short *ctlreg = (u_short *)(0xb8ff0000);
31757172Sutashiro 	register volatile u_short *crtreg = (u_short *)(0xb8fe0000);
31857172Sutashiro 	register volatile u_short *p;
31957172Sutashiro 	u_short	dummy;
32057172Sutashiro 
32157172Sutashiro 	*ctlreg = 0;			/* stop crtc */
32257172Sutashiro 	NOP;
32357172Sutashiro 
32457172Sutashiro 	/* initialize crtc without R3{0,1,2} */
32557172Sutashiro 	p = crtc_data[id][0];
32657172Sutashiro 	for (i = 0; i < 28; i++) {
32757172Sutashiro 		*crtreg++ = *p++;
32857172Sutashiro 		NOP;
32957172Sutashiro 	}
33057172Sutashiro 
33157172Sutashiro 	*ctlreg = 0x02;			/* start crtc */
33257172Sutashiro 	NOP;
33357172Sutashiro 
33457172Sutashiro 	/* set crtc control reg */
33557172Sutashiro 	p = crtc_data[id][1];
33657172Sutashiro 	for (i = 0; i < 6; i++) {
33757172Sutashiro 		*crtreg++ = *p++;
33857172Sutashiro 		NOP;
33957172Sutashiro 	}
34057172Sutashiro }
34157172Sutashiro 
34257172Sutashiro struct mfbdev fb253 = { (caddr_t)VRAM_START, VRAM_WIDTH };
34357172Sutashiro 
34457172Sutashiro void
fb253_setup(fb)34557172Sutashiro fb253_setup(fb)
34657172Sutashiro 	struct fbdev *fb;
34757172Sutashiro {
34857172Sutashiro 	int id;
34957172Sutashiro 
35057172Sutashiro 	if (fb->type) {
35157172Sutashiro 		fb->Mono = 1;
35257172Sutashiro 		fb->Colorwidth = 1;
35357172Sutashiro 		fb->fbNplane = 1;
35457172Sutashiro 		fb->planemask = 0x1;
35557172Sutashiro 		fb->Dimmer = 1;
35657172Sutashiro 
35757172Sutashiro 		id = ((*(volatile u_short *)(0xb8ff0000)) >> 8) & 0xf;
35857172Sutashiro 
35957172Sutashiro 		switch (id) {
36057172Sutashiro 		case 0:
36157172Sutashiro 			fb->FrameRect.extent.x = 2048;
36257172Sutashiro 			fb->FrameRect.extent.y = 2048;
36357172Sutashiro 			fb->VisRect.extent.x = 816;
36457172Sutashiro 			fb->VisRect.extent.y = 1024;
36557172Sutashiro 			fb->cursorP.x = 816/2;
36657172Sutashiro 			fb->cursorP.y = 1024/2;
36757172Sutashiro 			fb->font_w = 8;
36857172Sutashiro 			fb->font_h = 16;
36957172Sutashiro 			fb->char_w = 10;
37057172Sutashiro 			fb->char_h = 24;
37157172Sutashiro 			fb->scr_w = 816;
37257172Sutashiro 			fb->scr_h = 1024;
37357172Sutashiro 			fb->ch_pos = 5;
37457172Sutashiro 			fb->ul_pos = 22;
37557172Sutashiro 			fb->x_offset = 8;
37657172Sutashiro 			fb->y_offset = 8;
37757172Sutashiro 			fb->rit_m = 80;
37857172Sutashiro 			fb->btm_m = 42;
37957172Sutashiro 			break;
38057172Sutashiro 		case 1:
38157172Sutashiro 		case 2:
38257172Sutashiro 			fb->FrameRect.extent.x = 2048;
38357172Sutashiro 			fb->FrameRect.extent.y = 2048;
38457172Sutashiro 			fb->VisRect.extent.x = 1024;
38557172Sutashiro 			fb->VisRect.extent.y = 768;
38657172Sutashiro 			fb->cursorP.x = 1024/2;
38757172Sutashiro 			fb->cursorP.y = 768/2;
38857172Sutashiro 			fb->font_w = 8;
38957172Sutashiro 			fb->font_h = 16;
39057172Sutashiro 			fb->char_w = 12;
39157172Sutashiro 			fb->char_h = 22;
39257172Sutashiro 			fb->scr_w = 1024;
39357172Sutashiro 			fb->scr_h = 768;
39457172Sutashiro 			fb->ch_pos = 2;
39557172Sutashiro 			fb->ul_pos = 20;
39657172Sutashiro 			fb->x_offset = 32;
39757172Sutashiro 			fb->y_offset = 21;
39857172Sutashiro 			fb->rit_m = 80;
39957172Sutashiro 			fb->btm_m = 33;
40057172Sutashiro 			break;
40157172Sutashiro 		}
40257172Sutashiro 		fb->FrameRect.origin.x = 0;
40357172Sutashiro 		fb->FrameRect.origin.y = 0;
40457172Sutashiro 		fb->VisRect.origin.x = 0;
40557172Sutashiro 		fb->VisRect.origin.y = 0;
40657172Sutashiro 		fb->Krom_BM0.type = BM_MEM;
40757172Sutashiro 		fb->Krom_BM0.depth = 1;
40857172Sutashiro 		fb->Krom_BM0.width = 1;
40957172Sutashiro 		fb->Krom_BM0.rect.origin.x = 0;
41057172Sutashiro 		fb->Krom_BM0.rect.origin.y = 0;
41157172Sutashiro 		fb->Krom_BM0.rect.extent.x = 16;
41257172Sutashiro 		fb->Krom_BM0.rect.extent.y = 16;
41357172Sutashiro 		fb->Krom_BM1.type = BM_MEM;
41457172Sutashiro 		fb->Krom_BM1.depth = 1;
41557172Sutashiro 		fb->Krom_BM1.width = 2;
41657172Sutashiro 		fb->Krom_BM1.rect.origin.x = 0;
41757172Sutashiro 		fb->Krom_BM1.rect.origin.y = 0;
41857172Sutashiro 		fb->Krom_BM1.rect.extent.x = 24;
41957172Sutashiro 		fb->Krom_BM1.rect.extent.y = 24;
42057172Sutashiro 		fb->Krom_base = (char *)(0xb8e00000);
42157172Sutashiro 		fb->Krom_font_extent0.x = 16;
42257172Sutashiro 		fb->Krom_font_extent0.y = 16;
42357172Sutashiro 		fb->Krom_font_extent1.x = 24;
42457172Sutashiro 		fb->Krom_font_extent1.y = 24;
42557172Sutashiro 		fb->cursorSet = 0;
42657172Sutashiro 		fb->cursorVis = 0;
42757172Sutashiro 		fb->cursorShow = 0;
42857172Sutashiro 		fb->status_flag = 2;
42957172Sutashiro 		fb->run_flag = 0;
43057172Sutashiro 		fb->hard_cursor = 0;
43157172Sutashiro 
43257172Sutashiro 		fb->fbbm_op = &fb253_ops;
43357172Sutashiro 
43457172Sutashiro 		fb->private = (caddr_t)&fb253;
43557172Sutashiro 
43657172Sutashiro 		fb253_init(fb, id);
43757172Sutashiro 	}
43857172Sutashiro }
43957172Sutashiro #endif /* NNWB253 > 0 */
440