157219Sakito /*-
257219Sakito * Copyright (c) 1988 University of Utah.
357219Sakito * Copyright (c) 1992 OMRON Corporation.
4*63192Sbostic * Copyright (c) 1993, 19901992
5*63192Sbostic * The Regents of the University of California. All rights reserved.
657219Sakito *
757219Sakito * %sccs.include.redist.c%
857219Sakito *
957219Sakito * from: hp/dev/grf.c 7.13 (Berkeley) 7/12/92
1057219Sakito *
11*63192Sbostic * @(#)fb.c 8.1 (Berkeley) 06/10/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
2457772Sakito extern int hz;
2557772Sakito
2657772Sakito int fb_erase_screen();
2757772Sakito
2857219Sakito volatile struct fb_rfc *rfcPtr = (struct fb_rfc *) 0xB1000000;
2957219Sakito static struct fb_rfc rfcVal;
3057219Sakito
3157219Sakito int
fbopen(dev,flags,mode,p)3257219Sakito fbopen(dev, flags, mode, p)
3357219Sakito dev_t dev;
3457219Sakito int flags, mode;
3557219Sakito struct proc *p;
3657219Sakito {
3757772Sakito fb_erase_screen();
3857772Sakito
3957219Sakito return(0);
4057219Sakito }
4157219Sakito
4257219Sakito int
fbclose(dev,flags,mode,p)4357219Sakito fbclose(dev, flags, mode, p)
4457219Sakito dev_t dev;
4557219Sakito int flags, mode;
4657219Sakito struct proc *p;
4757219Sakito {
4857772Sakito fb_adjust(7, -27);
4957772Sakito
5057772Sakito timeout(fb_erase_screen, (caddr_t)0, hz);
5157772Sakito
5257219Sakito return(0);
5357219Sakito }
5457219Sakito
5557219Sakito int
fbioctl(dev,cmd,data,flags,p)5657219Sakito fbioctl(dev, cmd, data, flags, p)
5757219Sakito dev_t dev;
5857219Sakito int cmd;
5957219Sakito caddr_t data;
6057219Sakito int flags;
6157219Sakito struct proc *p;
6257219Sakito {
6357219Sakito struct fb_rfc *rfcp;
6457219Sakito int error;
6557219Sakito
6657219Sakito error = 0;
6757219Sakito switch (cmd) {
6857219Sakito
6957240Sakito case FBIOSETRFCT:
7057219Sakito *rfcPtr = rfcVal = *((struct fb_rfc *) data);
7157219Sakito break;
7257219Sakito
7357219Sakito case FBIOGETRFCT:
7457219Sakito *(struct fb_rfc *)data = rfcVal;
7557219Sakito break;
7657219Sakito
7757219Sakito default:
7857219Sakito error = EINVAL;
7957219Sakito break;
8057219Sakito
8157219Sakito }
8257219Sakito return(error);
8357219Sakito }
8457219Sakito
fb_adjust(hcnt,vcnt)8557219Sakito fb_adjust(hcnt, vcnt)
8657219Sakito int hcnt, vcnt;
8757219Sakito {
8857219Sakito rfcVal.rfc_hcnt = hcnt; /* shift left 16 dot */
8957219Sakito rfcVal.rfc_vcnt = vcnt; /* shift down 1 dot */
9057219Sakito
9157219Sakito *rfcPtr = rfcVal;
9257219Sakito }
9357219Sakito
9457772Sakito #define PL_WIDTH 64 /* Plane Width (long) */
9557772Sakito
9657772Sakito #define SB_HIGHT 1024 /* Screen Hight (Bit) */
9757772Sakito #define SL_WIDTH 40 /* Screen Width (Long) */
9857772Sakito
9957772Sakito #define SKIP_NEXT_LINE(addr) ( addr += (PL_WIDTH - SL_WIDTH) )
10057772Sakito
fb_erase_screen()10157772Sakito fb_erase_screen()
10257772Sakito {
10357772Sakito volatile register u_long *lp = (u_long *) 0xB1080008;
10457772Sakito
10557772Sakito register int i, j;
10657772Sakito
10757772Sakito for (i = 0; i < SB_HIGHT; i++) {
10857772Sakito for (j = 0; j < SL_WIDTH; j++)
10957772Sakito *lp++ = 0;
11057772Sakito SKIP_NEXT_LINE(lp);
11157772Sakito }
11257772Sakito
11357772Sakito return;
11457772Sakito }
11557772Sakito
11657219Sakito int
fbselect(dev,rw)11757219Sakito fbselect(dev, rw)
11857219Sakito dev_t dev;
11957219Sakito int rw;
12057219Sakito {
12157219Sakito return(0);
12257219Sakito }
12357219Sakito
12457219Sakito int
fbmap(dev,off,prot)12557219Sakito fbmap(dev, off, prot)
12657219Sakito dev_t dev;
12757219Sakito int off, prot;
12857219Sakito {
12957219Sakito return(((u_int) 0xB10C0000 + off) >> PGSHIFT);
13057219Sakito }
131