xref: /original-bsd/sys/luna68k/dev/fb.c (revision 2bdcd748)
1 /*-
2  * Copyright (c) 1988 University of Utah.
3  * Copyright (c) 1992 OMRON Corporation.
4  * Copyright (c) 1990,1992 The Regents of the University of California.
5  * 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	7.3 (Berkeley) 02/02/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 #include "bmc.h"
25 
26 extern	int hz;
27 
28 int	fb_erase_screen();
29 
30 volatile struct fb_rfc *rfcPtr = (struct fb_rfc *) 0xB1000000;
31 static   struct fb_rfc  rfcVal;
32 
33 int
34 fbopen(dev, flags, mode, p)
35 	dev_t dev;
36 	int flags, mode;
37 	struct proc *p;
38 {
39 	fb_erase_screen();
40 
41 	return(0);
42 }
43 
44 int
45 fbclose(dev, flags, mode, p)
46 	dev_t dev;
47 	int flags, mode;
48 	struct proc *p;
49 {
50 	fb_adjust(7, -27);
51 
52 	timeout(fb_erase_screen, (caddr_t)0, hz);
53 
54 	return(0);
55 }
56 
57 int
58 fbioctl(dev, cmd, data, flags, p)
59 	dev_t dev;
60 	int cmd;
61 	caddr_t data;
62 	int flags;
63 	struct proc *p;
64 {
65 	struct fb_rfc *rfcp;
66 	int error;
67 
68 	error = 0;
69 	switch (cmd) {
70 
71 	case FBIOSETRFCT:
72 		*rfcPtr = rfcVal = *((struct fb_rfc *) data);
73 		break;
74 
75 	case FBIOGETRFCT:
76                 *(struct fb_rfc *)data = rfcVal;
77 		break;
78 
79 	default:
80 		error = EINVAL;
81 		break;
82 
83 	}
84 	return(error);
85 }
86 
87 fb_adjust(hcnt, vcnt)
88 	int hcnt, vcnt;
89 {
90 	rfcVal.rfc_hcnt = hcnt;			/* shift left   16 dot */
91 	rfcVal.rfc_vcnt = vcnt;			/* shift down    1 dot */
92 
93 	*rfcPtr = rfcVal;
94 }
95 
96 #define PL_WIDTH	64				/* Plane Width  (long) */
97 
98 #define	SB_HIGHT	1024				/* Screen Hight  (Bit) */
99 #define SL_WIDTH	40				/* Screen Width (Long) */
100 
101 #define SKIP_NEXT_LINE(addr)			( addr += (PL_WIDTH - SL_WIDTH) )
102 
103 fb_erase_screen()
104 {
105 	volatile register u_long *lp = (u_long *) 0xB1080008;
106 
107 	register int i, j;
108 
109 	for (i = 0; i < SB_HIGHT; i++) {
110 		for (j = 0; j < SL_WIDTH; j++)
111 			*lp++ = 0;
112 		SKIP_NEXT_LINE(lp);
113 	}
114 
115 	return;
116 }
117 
118 int
119 fbselect(dev, rw)
120 	dev_t dev;
121 	int rw;
122 {
123 	return(0);
124 }
125 
126 int
127 fbmap(dev, off, prot)
128 	dev_t dev;
129 	int off, prot;
130 {
131 	return(((u_int) 0xB10C0000 + off) >> PGSHIFT);
132 }
133