xref: /csrg-svn/sys/luna68k/dev/fb.c (revision 57772)
157219Sakito /*-
257219Sakito  * Copyright (c) 1988 University of Utah.
357219Sakito  * Copyright (c) 1992 OMRON Corporation.
457219Sakito  * Copyright (c) 1990,1992 The Regents of the University of California.
557219Sakito  * All rights reserved.
657219Sakito  *
757219Sakito  * %sccs.include.redist.c%
857219Sakito  *
957219Sakito  * from: hp/dev/grf.c		7.13 (Berkeley) 7/12/92
1057219Sakito  *
11*57772Sakito  *	@(#)fb.c	7.3 (Berkeley) 02/02/93
1257219Sakito  */
1357219Sakito 
1457219Sakito /*
1557219Sakito  * fb.c -- frame-buffer device driver
1657219Sakito  *	by A.Fujita, Dec-16-1992
1757219Sakito  */
1857219Sakito 
1957219Sakito #include <sys/param.h>
2057219Sakito #include <sys/proc.h>
2157219Sakito #include <sys/ioctl.h>
2257219Sakito #include <luna68k/dev/fbio.h>
2357219Sakito 
2457240Sakito #include "bmc.h"
2557240Sakito 
26*57772Sakito extern	int hz;
27*57772Sakito 
28*57772Sakito int	fb_erase_screen();
29*57772Sakito 
3057219Sakito volatile struct fb_rfc *rfcPtr = (struct fb_rfc *) 0xB1000000;
3157219Sakito static   struct fb_rfc  rfcVal;
3257219Sakito 
3357219Sakito int
3457219Sakito fbopen(dev, flags, mode, p)
3557219Sakito 	dev_t dev;
3657219Sakito 	int flags, mode;
3757219Sakito 	struct proc *p;
3857219Sakito {
39*57772Sakito 	fb_erase_screen();
40*57772Sakito 
4157219Sakito 	return(0);
4257219Sakito }
4357219Sakito 
4457219Sakito int
4557219Sakito fbclose(dev, flags, mode, p)
4657219Sakito 	dev_t dev;
4757219Sakito 	int flags, mode;
4857219Sakito 	struct proc *p;
4957219Sakito {
50*57772Sakito 	fb_adjust(7, -27);
51*57772Sakito 
52*57772Sakito 	timeout(fb_erase_screen, (caddr_t)0, hz);
53*57772Sakito 
5457219Sakito 	return(0);
5557219Sakito }
5657219Sakito 
5757219Sakito int
5857219Sakito fbioctl(dev, cmd, data, flags, p)
5957219Sakito 	dev_t dev;
6057219Sakito 	int cmd;
6157219Sakito 	caddr_t data;
6257219Sakito 	int flags;
6357219Sakito 	struct proc *p;
6457219Sakito {
6557219Sakito 	struct fb_rfc *rfcp;
6657219Sakito 	int error;
6757219Sakito 
6857219Sakito 	error = 0;
6957219Sakito 	switch (cmd) {
7057219Sakito 
7157240Sakito 	case FBIOSETRFCT:
7257219Sakito 		*rfcPtr = rfcVal = *((struct fb_rfc *) data);
7357219Sakito 		break;
7457219Sakito 
7557219Sakito 	case FBIOGETRFCT:
7657219Sakito                 *(struct fb_rfc *)data = rfcVal;
7757219Sakito 		break;
7857219Sakito 
7957219Sakito 	default:
8057219Sakito 		error = EINVAL;
8157219Sakito 		break;
8257219Sakito 
8357219Sakito 	}
8457219Sakito 	return(error);
8557219Sakito }
8657219Sakito 
8757219Sakito fb_adjust(hcnt, vcnt)
8857219Sakito 	int hcnt, vcnt;
8957219Sakito {
9057219Sakito 	rfcVal.rfc_hcnt = hcnt;			/* shift left   16 dot */
9157219Sakito 	rfcVal.rfc_vcnt = vcnt;			/* shift down    1 dot */
9257219Sakito 
9357219Sakito 	*rfcPtr = rfcVal;
9457219Sakito }
9557219Sakito 
96*57772Sakito #define PL_WIDTH	64				/* Plane Width  (long) */
97*57772Sakito 
98*57772Sakito #define	SB_HIGHT	1024				/* Screen Hight  (Bit) */
99*57772Sakito #define SL_WIDTH	40				/* Screen Width (Long) */
100*57772Sakito 
101*57772Sakito #define SKIP_NEXT_LINE(addr)			( addr += (PL_WIDTH - SL_WIDTH) )
102*57772Sakito 
103*57772Sakito fb_erase_screen()
104*57772Sakito {
105*57772Sakito 	volatile register u_long *lp = (u_long *) 0xB1080008;
106*57772Sakito 
107*57772Sakito 	register int i, j;
108*57772Sakito 
109*57772Sakito 	for (i = 0; i < SB_HIGHT; i++) {
110*57772Sakito 		for (j = 0; j < SL_WIDTH; j++)
111*57772Sakito 			*lp++ = 0;
112*57772Sakito 		SKIP_NEXT_LINE(lp);
113*57772Sakito 	}
114*57772Sakito 
115*57772Sakito 	return;
116*57772Sakito }
117*57772Sakito 
11857219Sakito int
11957219Sakito fbselect(dev, rw)
12057219Sakito 	dev_t dev;
12157219Sakito 	int rw;
12257219Sakito {
12357219Sakito 	return(0);
12457219Sakito }
12557219Sakito 
12657219Sakito int
12757219Sakito fbmap(dev, off, prot)
12857219Sakito 	dev_t dev;
12957219Sakito 	int off, prot;
13057219Sakito {
13157219Sakito 	return(((u_int) 0xB10C0000 + off) >> PGSHIFT);
13257219Sakito }
133