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