📄 fb.c
字号:
register struct iop_device *ii;#if defined(IPC_MRX) && defined(mips) register struct fbreg *fbp = (struct fbreg *)MACH_CACHED_TO_UNCACHED(&fbreg[unit]);#else register struct fbreg *fbp = &fbreg[unit];#endif if (unit >= NFB || (ii = fbinfo[unit]) == 0 || ii->ii_alive == 0) return (ENXIO); if (fb->fbs_state == 0) return(0); if(!FBVIDEO(dev)) fb->fbs_flag = 0; fb->fbs_state &= ~(FBVIDEO(dev) ? VIDEO_USED : FB_USED); if (fb->fbs_state == 0) { fbp->fb_device = fb->fbs_device; fbreset(fbp); } return (0);}fbioctl(dev, cmd, data, flag) dev_t dev; caddr_t data;{ register int unit = FBUNIT(dev); register struct fb_softc *fb = &fb_softc[unit]; register struct iop_device *ii; register int error = 0;#if defined(IPC_MRX) && defined(mips) register struct fbreg *fbp = (struct fbreg *)MACH_CACHED_TO_UNCACHED(&fbreg[unit]);#else register struct fbreg *fbp = &fbreg[unit];#endif if (unit >= NFB || (ii = fbinfo[unit]) == 0 || ii->ii_alive == 0) return (ENXIO); fblock(); fbp->fb_device = fb->fbs_device; switch (cmd) { case FBIOCENABLE: fb->fbs_flag = 0; break; case FBIOCDISABLE: fb->fbs_flag = 1; break; case FBIOCAUTODIM: fbp->fb_command = FB_CAUTODIM; fbp->fb_data = *((int *)data); fbstart(fbp, 0); break; case FBIOCSETDIM: fbp->fb_command = FB_CSETDIM; fbp->fb_data = *((int*)data); fbstart(fbp, 0); break; case FBIOCGETDIM: fbp->fb_command = FB_CGETDIM; fbstart(fbp, 1); *((int*)data) = fbp->fb_data; break; case FBIOCBITBLT: error = fbbitblt(fbp, (sBitblt *)data); break; case FBIOCNBITBLT: error = fbnbitblt(fbp, (lBitblt *)data, UIO_USERSPACE); break; case FBIOCBATCHBITBLT: error = fbbatchbitblt(fbp, (sBatchBitblt*)data, UIO_USERSPACE); break; case FBIOCNBATCHBITBLT: error = fbnbatchbitblt(fbp, (lBatchBitblt*)data, UIO_USERSPACE); break; case FBIOCTILEBITBLT: error = fbtilebitblt(fbp, (sTileBitblt *)data); break; case FBIOCNTILEBITBLT: error = fbntilebitblt(fbp, (lTileBitblt *)data); break; case FBIOCBITBLT3: error = fbbitblt3(fbp, (sBitblt3 *)data); break; case FBIOCNBITBLT3: error = fbnbitblt3(fbp, (lBitblt3 *)data); break; case FBIOCPOLYLINE: error = fbpolyline(fbp, (sPrimLine *)data, 0); break; case FBIOCNPOLYLINE: error = fbnpolyline(fbp, (lPrimLine *)data, 0, UIO_USERSPACE); break; case FBIOCDJPOLYLINE: error = fbpolyline(fbp, (sPrimLine *)data, 1); break; case FBIOCNDJPOLYLINE: error = fbnpolyline(fbp, (lPrimLine *)data, 1, UIO_USERSPACE); break; case FBIOCPOLYMARKER: error = fbpolymarker(fbp, (sPrimMarker *)data); break; case FBIOCNPOLYMARKER: error = fbnpolymarker(fbp, (lPrimMarker *)data, UIO_USERSPACE); break; case FBIOCRECTANGLE: error = fbrectangle(fbp, (sPrimRect *)data); break; case FBIOCNRECTANGLE: error = fbnrectangle(fbp, (lPrimRect *)data); break; case FBIOCFILLSCAN: error = fbfillscan(fbp, (sPrimFill *)data); break; case FBIOCNFILLSCAN: error = fbnfillscan(fbp, (lPrimFill *)data, UIO_USERSPACE); break; case FBIOCTEXT: error = fbtext(fbp, (sPrimText *)data); break; case FBIOCNTEXT: error = fbntext(fbp, (lPrimText *)data); break; case FBIOCPOLYDOT: error = fbpolydot(fbp, (sPrimDot *)data); break; case FBIOCNPOLYDOT: error = fbnpolydot(fbp, (lPrimDot *)data, UIO_USERSPACE); break; case FBIOCGETSCRTYPE: fbgetscrtype(fbp, (sScrType *)data); break; case FBIOCNGETSCRTYPE: fbp->fb_command = FB_CGETSCRTYPE; fbstart(fbp, 1); *((lScrType*)data) = fbp->fb_scrtype; break; case FBIOCSETPALETTE: fbsetpalette(fbp, (sPalette *)data); break; case FBIOCNSETPALETTE: error = fbnsetpalette(fbp, (lPalette *)data); break; case FBIOCGETPALETTE: fbgetpalette(fbp, (sPalette *)data); break; case FBIOCNGETPALETTE: error = fbngetpalette(fbp, (lPalette *)data); break; case FBIOCSETCURSOR: fbsetcursor(fbp, (sCursor *)data); break; case FBIOCNSETCURSOR: fbnsetcursor(fbp, (lCursor *)data); break; case FBIOCNSETCURSOR2: fbp->fb_command = FB_CSETCURSOR; fbp->fb_cursor = *((lCursor2 *)data); fbstart(fbp, 0); break; case FBIOCUNSETCURSOR: fbp->fb_command = FB_CUNSETCURSOR; fbstart(fbp, 0); break; case FBIOCNUNSETCURSOR: fbp->fb_command = FB_CUNSETCURSOR; fbstart(fbp, 0); break; case FBIOCSHOWCURSOR: fbp->fb_command = FB_CSHOWCURSOR; fbstart(fbp, 0); break; case FBIOCNSHOWCURSOR: fbp->fb_command = FB_CSHOWCURSOR; fbstart(fbp, 0); break; case FBIOCHIDECURSOR: fbp->fb_command = FB_CHIDECURSOR; fbstart(fbp, 0); break; case FBIOCNHIDECURSOR: fbp->fb_command = FB_CHIDECURSOR; fbstart(fbp, 0); break; case FBIOCSETXY: fbsetxy(fbp, (sPoint *)data); break; case FBIOCNSETXY: fbp->fb_command = FB_CSETXY; fbp->fb_point = *((lPoint *)data); fbstart(fbp, 0); break; case FBIOCNSETPALETTEMODE: fbp->fb_command = FB_CSETPMODE; fbp->fb_data = *((int*)data); fbstart(fbp, 0); break; case FBIOCNGETPALETTEMODE: fbp->fb_command = FB_CGETPMODE; fbstart(fbp, 1); *((int*)data) = fbp->fb_data; break; case FBIOCNSETVIDEO: fbp->fb_command = FB_CSETVIDEO; fbp->fb_videoctl = *((lVideoCtl*)data); fbstart(fbp, 0); break; case FBIOCNGETVIDEO: fbp->fb_command = FB_CGETVIDEO; fbp->fb_videostatus.request = VIDEO_STATUS; fbstart(fbp, 1); *((lVideoStatus*)data) = fbp->fb_videostatus; error = fbp->fb_result; break; case FBIOCNIOCTL: fbp->fb_command = FB_CIOCTL; fbp->fb_fbioctl = *((lFbIoctl*)data); fbstart(fbp, 1); *((lFbIoctl*)data) = fbp->fb_fbioctl; if (fbp->fb_result == FB_RERROR) error = EINVAL; break; default: error = ENXIO; break; } fbunlock(error); return (error);}fbmmap(dev, off, prot) dev_t dev; off_t off; int prot;{ register int unit = FBUNIT(dev); register struct fb_softc *fb = &fb_softc[unit]; register struct iop_device *ii; register int page; register struct fbreg *fbp = &fbreg[unit]; if (unit >= NFB || (ii = fbinfo[unit]) == 0 || ii->ii_alive == 0) return (-1); fblock(); fbp->fb_device = fb->fbs_device; fbp->fb_command = FB_CGETPAGE; fbp->fb_data = off; fbstart(fbp, 1); page = fbp->fb_data; if (fbp->fb_result == FB_RERROR) page = -1; else fb->fbs_flag = 1; fbunlock(fbp->fb_result); return (page);}static voidfblock(){ int s;#ifdef USE_RAW_INTR fbwait();#endif s = splfb(); while (fbstate & FB_BUSY) { fbstate |= FB_WANTED; sleep((caddr_t)&fbstate, FBPRI); } fbstate |= FB_BUSY; splx(s);}static voidfbunlock(error) int error;{ int s = splfb();#ifdef CPU_SINGLE fbstate &= ~FB_BUSY; if (fbstate & FB_WANTED) { fbstate &= ~FB_WANTED; wakeup((caddr_t)&fbstate); }#else#ifdef USE_RAW_INTR fbstate &= ~FB_BUSY; if (fbstate & FB_WANTED) { fbstate &= ~FB_WANTED; wakeup((caddr_t)&fbstate); }#else if (error || (fbstate & FB_DELAY) == 0) { fbstate &= ~(FB_BUSY | FB_WAIT | FB_DELAY); if (fbstate & FB_WANTED) { fbstate &= ~FB_WANTED; wakeup((caddr_t)&fbstate); } } if (fbstate & FB_DELAY) { fbstate &= ~FB_DELAY; fbstate |= FB_DELAY2; }#endif#endif /* CPU_SINGLE */ splx(s);}static intfbinit(fbp) struct fbreg *fbp;{ fblock(); fbp->fb_command = FB_COPEN; fbstart(fbp, 1); if (fbp->fb_result != FB_ROK) { fbunlock(0); return (FB_RERROR); } fbp->fb_command = FB_CUNSETCURSOR; fbstart(fbp, 0); fbunlock(0); return (FB_ROK);}static voidfbreset(fbp) struct fbreg *fbp;{ fblock(); fbp->fb_command = FB_CUNSETCURSOR; fbstart(fbp, 1); fbp->fb_command = FB_CCLOSE; fbstart(fbp, 0); fbunlock(0);}#endif /* NFB */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -