xref: /original-bsd/sys/luna68k/dev/fb.c (revision 3705696b)
1 /*-
2  * Copyright (c) 1988 University of Utah.
3  * Copyright (c) 1992 OMRON Corporation.
4  * Copyright (c) 1993, 19901992
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * %sccs.include.redist.c%
8  *
9  * from: hp/dev/grf.c		7.13 (Berkeley) 7/12/92
10  *
11  *	@(#)fb.c	8.1 (Berkeley) 06/10/93
12  */
13 
14 /*
15  * fb.c -- frame-buffer device driver
16  *	by A.Fujita, Dec-16-1992
17  */
18 
19 #include <sys/param.h>
20 #include <sys/proc.h>
21 #include <sys/ioctl.h>
22 #include <luna68k/dev/fbio.h>
23 
24 extern	int hz;
25 
26 int	fb_erase_screen();
27 
28 volatile struct fb_rfc *rfcPtr = (struct fb_rfc *) 0xB1000000;
29 static   struct fb_rfc  rfcVal;
30 
31 int
32 fbopen(dev, flags, mode, p)
33 	dev_t dev;
34 	int flags, mode;
35 	struct proc *p;
36 {
37 	fb_erase_screen();
38 
39 	return(0);
40 }
41 
42 int
43 fbclose(dev, flags, mode, p)
44 	dev_t dev;
45 	int flags, mode;
46 	struct proc *p;
47 {
48 	fb_adjust(7, -27);
49 
50 	timeout(fb_erase_screen, (caddr_t)0, hz);
51 
52 	return(0);
53 }
54 
55 int
56 fbioctl(dev, cmd, data, flags, p)
57 	dev_t dev;
58 	int cmd;
59 	caddr_t data;
60 	int flags;
61 	struct proc *p;
62 {
63 	struct fb_rfc *rfcp;
64 	int error;
65 
66 	error = 0;
67 	switch (cmd) {
68 
69 	case FBIOSETRFCT:
70 		*rfcPtr = rfcVal = *((struct fb_rfc *) data);
71 		break;
72 
73 	case FBIOGETRFCT:
74                 *(struct fb_rfc *)data = rfcVal;
75 		break;
76 
77 	default:
78 		error = EINVAL;
79 		break;
80 
81 	}
82 	return(error);
83 }
84 
85 fb_adjust(hcnt, vcnt)
86 	int hcnt, vcnt;
87 {
88 	rfcVal.rfc_hcnt = hcnt;			/* shift left   16 dot */
89 	rfcVal.rfc_vcnt = vcnt;			/* shift down    1 dot */
90 
91 	*rfcPtr = rfcVal;
92 }
93 
94 #define PL_WIDTH	64				/* Plane Width  (long) */
95 
96 #define	SB_HIGHT	1024				/* Screen Hight  (Bit) */
97 #define SL_WIDTH	40				/* Screen Width (Long) */
98 
99 #define SKIP_NEXT_LINE(addr)			( addr += (PL_WIDTH - SL_WIDTH) )
100 
101 fb_erase_screen()
102 {
103 	volatile register u_long *lp = (u_long *) 0xB1080008;
104 
105 	register int i, j;
106 
107 	for (i = 0; i < SB_HIGHT; i++) {
108 		for (j = 0; j < SL_WIDTH; j++)
109 			*lp++ = 0;
110 		SKIP_NEXT_LINE(lp);
111 	}
112 
113 	return;
114 }
115 
116 int
117 fbselect(dev, rw)
118 	dev_t dev;
119 	int rw;
120 {
121 	return(0);
122 }
123 
124 int
125 fbmap(dev, off, prot)
126 	dev_t dev;
127 	int off, prot;
128 {
129 	return(((u_int) 0xB10C0000 + off) >> PGSHIFT);
130 }
131