xref: /csrg-svn/sys/news3400/fb/fbbm_lcdm.c (revision 63260)
153893Smckusick /*
2*63260Sbostic  * Copyright (c) 1992, 1993
3*63260Sbostic  *	The Regents of the University of California.  All rights reserved.
453893Smckusick  *
553893Smckusick  * This code is derived from software contributed to Berkeley by
653893Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753893Smckusick  *
853893Smckusick  * %sccs.include.redist.c%
953893Smckusick  *
1053893Smckusick  * from: $Hdr: fbbm_lcdm.c,v 4.300 91/06/09 06:33:38 root Rel41 $ SONY
1153893Smckusick  *
12*63260Sbostic  *	@(#)fbbm_lcdm.c	8.1 (Berkeley) 06/11/93
1353893Smckusick  */
1453893Smckusick 
1553893Smckusick /*
1653893Smckusick  * LCD frame buffer driver
1753893Smckusick  */
1853893Smckusick 
1953893Smckusick #include "lfbm.h"
2053893Smckusick 
2153893Smckusick #if NLFBM > 0
2253893Smckusick 
2357178Sutashiro #include <sys/param.h>
2457178Sutashiro #include <news3400/iop/framebuf.h>
2557178Sutashiro #include <news3400/iop/fbreg.h>
2653893Smckusick 
2757178Sutashiro #include <news3400/fb/fbdefs.h>
2853893Smckusick 
2953893Smckusick extern int nofunc();
3053893Smckusick extern int error();
3153893Smckusick extern char *ext_fnt24_addr[];
3253893Smckusick extern char *ext_fnt_addr[];
3353893Smckusick 
3453893Smckusick extern short zero[];
3553893Smckusick 
3653893Smckusick extern unsigned int mfbmask32[];
3753893Smckusick extern unsigned int mfbrmask32[];
3853893Smckusick 
3953893Smckusick #define NOP	for (j = 0; j < 40; j++)
4053893Smckusick 
4153893Smckusick #ifdef news3200
4253893Smckusick #define LCD_PORT	(volatile unsigned long *)(0xb0000000)
4353893Smckusick #define DIMMER_PORT	(volatile unsigned long *)(0xb0100000)
4453893Smckusick #define LCD_CRTC	(volatile unsigned char *)(0xbff60000)
4553893Smckusick #define	KROM_START	(char *)(0x90000000)
4653893Smckusick #define	VRAM_START	(unsigned long *)(0x90200000)
4753893Smckusick #define VRAM_WIDTH	(1120/32)
4853893Smckusick #endif
4953893Smckusick 
5060002Sutashiro void
lfbmattach(i)5160002Sutashiro lfbmattach(i)
5260002Sutashiro {
5360002Sutashiro 	/* temporary hack for pseudo-device initialization */;
5460002Sutashiro }
5560002Sutashiro 
5653893Smckusick #ifdef news3200
5753893Smckusick static caddr_t
fblfbm_Krom_addr(fb,c,sr)5853893Smckusick fblfbm_Krom_addr(fb, c, sr)
5953893Smckusick 	struct fbdev *fb;
6053893Smckusick 	register int c;
6153893Smckusick 	lRectangle *sr;
6253893Smckusick {
6353893Smckusick 	register int i;
6453893Smckusick 	register u_short *tmp;
6553893Smckusick 	static int tmpfnt[24];
6653893Smckusick 
6753893Smckusick 	if ((c >= 0x20) && (c <= 0x7e)) {
6853893Smckusick 		/*
6953893Smckusick 		 * ASCII char
7053893Smckusick 		 */
7153893Smckusick 		c -= ' ';
7253893Smckusick 		c = ((c & 0x1f) | ((c & 0xe0) << 2)) << 7;
7353893Smckusick 		tmp = (u_short *)(fb->Krom_base + (c + (sr->extent.y > 16 ? 0 : 96)) * 2);
7453893Smckusick 	} else if ((c >= 0xa1) && (c <= 0xdf)) {
7553893Smckusick 		/*
7653893Smckusick 		 * KANA char
7753893Smckusick 		 */
7853893Smckusick 		if (sr->extent.y > 16)
7953893Smckusick 			tmp =  (u_short *)ext_fnt24_addr[c + 64];
8053893Smckusick 		else
8153893Smckusick 			tmp =  (u_short *)ext_fnt_addr[c + 64];
8253893Smckusick 	} else if ((c >= 0x2020) && (c <= 0x7e7e)) {
8353893Smckusick 		/*
8453893Smckusick 		 * KANJI char
8553893Smckusick 		 */
8653893Smckusick 		switch (c & 0x7000) {
8753893Smckusick 		case 0x2000:
8853893Smckusick 			c = ((c & 0x1f) | ((c & 0x60) << 5) | ((c & 0x700) >> 1)) << 7;
8953893Smckusick 			break;
9053893Smckusick 		case 0x3000:
9153893Smckusick 		case 0x4000:
9253893Smckusick 			c = ((c & 0x7f) | ((c & 0xf00) >> 1) | ((c & 0x4000) >> 3)) << 7;
9353893Smckusick 			break;
9453893Smckusick 		case 0x5000:
9553893Smckusick 		case 0x6000:
9653893Smckusick 			c = ((c & 0x7f) | ((c & 0xf00) >> 1) | ((c & 0x2000) >> 2)
9753893Smckusick 				| 0x1000) << 7;
9853893Smckusick 			break;
9953893Smckusick 		case 0x7000:
10053893Smckusick 			c = ((c & 0x1f) | ((c & 0x60) << 5) | ((c & 0x700) >> 1)
10153893Smckusick 				| 0x1000) << 7;
10253893Smckusick 			break;
10353893Smckusick 		}
10453893Smckusick 		tmp = (u_short *)(fb->Krom_base + (c + (sr->extent.y > 16 ? 0 : 96)) * 2);
10553893Smckusick 	} else {
10653893Smckusick 		/*
10753893Smckusick 		 * UNKNOWN char
10853893Smckusick 		 */
10953893Smckusick 		return ((caddr_t)zero);
11053893Smckusick 	}
11153893Smckusick 
11253893Smckusick 	if (sr->extent.y > 16) {
11353893Smckusick 		for (i = 0; i < 24; i++) {
11453893Smckusick 			tmpfnt[i] = (*tmp << 16) | *(tmp + 2);
11553893Smckusick 			tmp += 4;
11653893Smckusick 		}
11753893Smckusick 	} else {
11853893Smckusick 		for (i = 0; i < 16; i++) {
11953893Smckusick 			tmpfnt[i] = (*tmp << 16) | *(tmp + 2);
12053893Smckusick 			tmp += 4;
12153893Smckusick 		}
12253893Smckusick 	}
12353893Smckusick 
12453893Smckusick 	return ((caddr_t)tmpfnt);
12553893Smckusick }
12653893Smckusick #endif /* news3200 */
12753893Smckusick 
12853893Smckusick static int
fblfbm_set_dimmer(fb,dim)12953893Smckusick fblfbm_set_dimmer(fb, dim)
13053893Smckusick 	struct fbdev *fb;
13153893Smckusick 	int dim;
13253893Smckusick {
13353893Smckusick 	int s;
13453893Smckusick 
13553893Smckusick 	fb->status_flag = dim ? 0xf1: 0xf0;
13653893Smckusick #ifdef news3200
13753893Smckusick 	*DIMMER_PORT = fb->status_flag;
13853893Smckusick #endif
13953893Smckusick 	return (FB_ROK);
14053893Smckusick }
14153893Smckusick 
14253893Smckusick static int
fblfbm_get_dimmer(fb)14353893Smckusick fblfbm_get_dimmer(fb)
14453893Smckusick 	struct fbdev *fb;
14553893Smckusick {
14653893Smckusick 	return (fb->status_flag & 0x1);
14753893Smckusick }
14853893Smckusick 
14953893Smckusick int
fblfbm_get_pixel(fb,pixel)15053893Smckusick fblfbm_get_pixel(fb, pixel)
15153893Smckusick 	struct fbdev *fb;
15253893Smckusick 	register int pixel;
15353893Smckusick {
15453893Smckusick 	return (pixel);
15553893Smckusick }
15653893Smckusick 
15753893Smckusick int
fblfbm_get_page(fb,off)15853893Smckusick fblfbm_get_page(fb, off)
15953893Smckusick 	struct fbdev *fb;
16053893Smckusick 	off_t off;
16153893Smckusick {
16253893Smckusick 	if (off < 1120/8 * 930) {		/* X/8 * Y */
16353893Smckusick #ifdef news3200
16453893Smckusick 		return (((unsigned int)0x10200000 + off) >> PGSHIFT);
16553893Smckusick #endif
16653893Smckusick 	} else
16753893Smckusick 		return (-1);
16853893Smckusick }
16953893Smckusick 
17053893Smckusick int
fblfbm_probe(unit)17153893Smckusick fblfbm_probe(unit)
17253893Smckusick 	int unit;
17353893Smckusick {
17453893Smckusick #ifdef news3200
17553893Smckusick 	if (unit < NLFBM) {
17653893Smckusick 		if (badaddr(0xbff50000, 1))
17753893Smckusick 			return 0;
17853893Smckusick 		else {
17953893Smckusick 			if (*(volatile u_char *)(0xbff50000) == 0xff)
18053893Smckusick 				return FB_LCDM;
18153893Smckusick 			else
18253893Smckusick 				return 0;
18353893Smckusick 		}
18453893Smckusick 	}
18553893Smckusick #endif /* news3200 */
18653893Smckusick 	return 0;
18753893Smckusick }
18853893Smckusick 
18953893Smckusick void fbmem_rop_init();
19053893Smckusick void fbmem_rop_copy();
19153893Smckusick void fbmem_rop_winit();
19253893Smckusick void fbmem_rop_write();
19353893Smckusick void fbmem_rop_read();
19453893Smckusick void fbmem_rop_cinit();
19553893Smckusick void fbmem_rop_clear();
19653893Smckusick void fbmem_rop_vect();
19753893Smckusick void fbmem_rop_dot();
19853893Smckusick 
19953893Smckusick struct fbdev_ops fblfbm_ops = {
20053893Smckusick 	fbmem_rop_init,			/* (*fb_rop_init)() */
20153893Smckusick 	fbmem_rop_copy,			/* (*fb_rop_copy)() */
20253893Smckusick 	fbmem_rop_winit,		/* (*fb_rop_winit)() */
20353893Smckusick 	fbmem_rop_write,		/* (*fb_rop_write)() */
20453893Smckusick 	fbmem_rop_read,			/* (*fb_rop_read)() */
20553893Smckusick 	fbmem_rop_cinit,		/* (*fb_rop_cinit)() */
20653893Smckusick 	fbmem_rop_clear,		/* (*fb_rop_clear)() */
20753893Smckusick 	fbmem_rop_vect,			/* (*fb_rop_vect)() */
20853893Smckusick 	fbmem_rop_dot,			/* (*fb_rop_dot)() */
20953893Smckusick 	(void (*)())nofunc,		/* (*fb_rop_fillscan)() */
21053893Smckusick 	(void (*)())error,		/* (*fb_rop_wait)() */
21153893Smckusick 	(void (*)())error,		/* (*fb_rop_reset)() */
21253893Smckusick 	fblfbm_Krom_addr,		/* *(*fb_Krom_addr)() */
21353893Smckusick 	(void (*)())error,		/* (*fb_init_palette)() */
21453893Smckusick 	error,				/* (*fb_set_palette)() */
21553893Smckusick 	error,				/* (*fb_get_palette)() */
21653893Smckusick 	fblfbm_get_pixel,		/* (*fb_get_pixel)() */
21753893Smckusick 	fblfbm_set_dimmer,		/* (*fb_set_dimmer)() */
21853893Smckusick 	fblfbm_get_dimmer,		/* (*fb_get_dimmer)() */
21953893Smckusick 	nofunc,				/* (*fb_open)() */
22053893Smckusick 	nofunc,				/* (*fb_close)() */
22153893Smckusick 	nofunc,				/* (*fb_ioctl)() */
22253893Smckusick 	fblfbm_get_page,		/* (*fb_get_page)() */
22353893Smckusick 	(void (*)())nofunc,		/* (*fb_cursor_set)() */
22453893Smckusick 	(void (*)())nofunc,		/* (*fb_cursor_on)() */
22553893Smckusick 	(void (*)())nofunc,		/* (*fb_cursor_off)() */
22653893Smckusick 	(void (*)())nofunc,		/* (*fb_cursor_move)() */
22753893Smckusick };
22853893Smckusick 
22953893Smckusick static char lctc_data[] = {
23053893Smckusick 	0, 47,
23153893Smckusick 	1, 35,
23253893Smckusick 	9, 0,
23353893Smckusick 	10, 0,
23453893Smckusick 	11, 0,
23553893Smckusick 	12, 0,
23653893Smckusick 	13, 0,
23753893Smckusick 	14, 0,
23853893Smckusick 	15, 0,
23953893Smckusick 	18, 35,
24053893Smckusick 	19, 0x01,
24153893Smckusick 	20, 0x85,
24253893Smckusick 	21, 0,
24353893Smckusick 	22, 0x10
24453893Smckusick };
24553893Smckusick 
24653893Smckusick struct mfbdev fblcd = { (caddr_t)VRAM_START, VRAM_WIDTH };
24753893Smckusick 
24853893Smckusick void
fblfbm_setup(fb)24953893Smckusick fblfbm_setup(fb)
25053893Smckusick 	register struct fbdev *fb;
25153893Smckusick {
25253893Smckusick 	register int i;
25353893Smckusick 	register volatile unsigned char *lctreg = LCD_CRTC;
25453893Smckusick 
25553893Smckusick 	if (fb->type) {
25653893Smckusick 		fb->Mono = 1;
25753893Smckusick 		fb->Colorwidth = 1;
25853893Smckusick 		fb->fbNplane = 1;
25953893Smckusick 		fb->planemask = 0x1;
26053893Smckusick 		fb->Dimmer = 1;
26153893Smckusick 
26253893Smckusick 		fb->FrameRect.origin.x = 0;
26353893Smckusick 		fb->FrameRect.origin.y = 0;
26453893Smckusick 		fb->FrameRect.extent.x = 1120;
26553893Smckusick 		fb->FrameRect.extent.y = 930;
26653893Smckusick 		fb->VisRect.origin.x = 0;
26753893Smckusick 		fb->VisRect.origin.y = 0;
26853893Smckusick 		fb->VisRect.extent.x = 1120;
26953893Smckusick 		fb->VisRect.extent.y = 780;
27053893Smckusick 		fb->Krom_BM0.type = BM_MEM;
27153893Smckusick 		fb->Krom_BM0.depth = 1;
27253893Smckusick 		fb->Krom_BM0.width = 1;
27353893Smckusick 		fb->Krom_BM0.rect.origin.x = 0;
27453893Smckusick 		fb->Krom_BM0.rect.origin.y = 0;
27553893Smckusick 		fb->Krom_BM0.rect.extent.x = 16;
27653893Smckusick 		fb->Krom_BM0.rect.extent.y = 16;
27753893Smckusick 		fb->Krom_BM1.type = BM_MEM;
27853893Smckusick 		fb->Krom_BM1.depth = 1;
27953893Smckusick 		fb->Krom_BM1.width = 2;
28053893Smckusick 		fb->Krom_BM1.rect.origin.x = 0;
28153893Smckusick 		fb->Krom_BM1.rect.origin.y = 0;
28253893Smckusick 		fb->Krom_BM1.rect.extent.x = 32;
28353893Smckusick 		fb->Krom_BM1.rect.extent.y = 32;
28453893Smckusick 		fb->Krom_base = KROM_START;
28553893Smckusick 		fb->Krom_font_extent0.x = 16;
28653893Smckusick 		fb->Krom_font_extent0.y = 16;
28753893Smckusick 		fb->Krom_font_extent1.x = 24;
28853893Smckusick 		fb->Krom_font_extent1.y = 24;
28953893Smckusick 		fb->font_w = 12;
29053893Smckusick 		fb->font_h = 24;
29153893Smckusick 		fb->char_w = 12;
29253893Smckusick 		fb->char_h = 26;
29353893Smckusick 		fb->scr_w = 1120;
29453893Smckusick 		fb->scr_h = 780;
29553893Smckusick 		fb->ch_pos = 0;
29653893Smckusick 		fb->ul_pos = 24;
29753893Smckusick 		fb->x_offset = (1120 - (80 * 12)) / 2;
29853893Smckusick 		fb->y_offset = ( 780 - (29 * 26)) / 2;
29953893Smckusick 		fb->rit_m = 80;
30053893Smckusick 		fb->btm_m = 29;
30153893Smckusick 		fb->cursorSet = 0;
30253893Smckusick 		fb->cursorVis = 0;
30353893Smckusick 		fb->cursorShow = 0;
30453893Smckusick 		fb->cursorP.x = 1120/2;
30553893Smckusick 		fb->cursorP.y = 780/2;
30653893Smckusick 		fb->status_flag = 1;
30753893Smckusick 		fb->run_flag = 0;
30853893Smckusick 		fb->hard_cursor = 0;
30953893Smckusick 
31053893Smckusick 		fb->fbbm_op = &fblfbm_ops;
31153893Smckusick 
31253893Smckusick 		fb->private = (caddr_t)&fblcd;
31353893Smckusick 
31453893Smckusick 		for (i = 0; i < 28; i++)
31553893Smckusick 			*lctreg++ = lctc_data[i];
31653893Smckusick 		for (i = 0; i < 500000; i ++)
31753893Smckusick 			;
31853893Smckusick 		*LCD_PORT = 1;
31953893Smckusick 	}
32053893Smckusick }
32153893Smckusick #endif /* NLFBM > 0 */
322