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
fbopen(dev,flags,mode,p)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
fbclose(dev,flags,mode,p)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
fbioctl(dev,cmd,data,flags,p)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
fb_adjust(hcnt,vcnt)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
fb_erase_screen()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
fbselect(dev,rw)117 fbselect(dev, rw)
118 dev_t dev;
119 int rw;
120 {
121 return(0);
122 }
123
124 int
fbmap(dev,off,prot)125 fbmap(dev, off, prot)
126 dev_t dev;
127 int off, prot;
128 {
129 return(((u_int) 0xB10C0000 + off) >> PGSHIFT);
130 }
131