⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fb.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -