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

📄 cgsix.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1993 *	The Regents of the University of California.  All rights reserved. * * This software was developed by the Computer Systems Engineering group * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and * contributed to Berkeley. * * All advertising materials mentioning features or use of this software * must display the following acknowledgement: *	This product includes software developed by the University of *	California, Lawrence Berkeley Laboratory. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * *	@(#)cgsix.c	8.4 (Berkeley) 1/21/94 * * from: $Header: cgsix.c,v 1.2 93/10/18 00:01:51 torek Exp $ *//* * color display (cgsix) driver. * * Does not handle interrupts, even though they can occur. * * XXX should defer colormap updates to vertical retrace interrupts */#include <sys/param.h>#include <sys/buf.h>#include <sys/device.h>#include <sys/fbio.h>#include <sys/ioctl.h>#include <sys/malloc.h>#include <sys/mman.h>#include <sys/tty.h>#ifdef DEBUG#include <sys/proc.h>#include <sys/syslog.h>#endif#include <machine/autoconf.h>#include <machine/pmap.h>#include <machine/fbvar.h>#include <sparc/sbus/btreg.h>#include <sparc/sbus/btvar.h>#include <sparc/sbus/cgsixreg.h>#include <sparc/sbus/sbusvar.h>union cursor_cmap {		/* colormap, like bt_cmap, but tiny */	u_char	cm_map[2][3];	/* 2 R/G/B entries */	u_int	cm_chip[2];	/* 2 chip equivalents */};struct cg6_cursor {		/* cg6 hardware cursor status */	short	cc_enable;		/* cursor is enabled */	struct	fbcurpos cc_pos;	/* position */	struct	fbcurpos cc_hot;	/* hot-spot */	struct	fbcurpos cc_size;	/* size of mask & image fields */	u_int	cc_bits[2][32];		/* space for mask & image bits */	union	cursor_cmap cc_color;	/* cursor colormap */};/* per-display variables */struct cgsix_softc {	struct	device sc_dev;		/* base device */	struct	sbusdev sc_sd;		/* sbus device */	struct	fbdevice sc_fb;		/* frame buffer device */	volatile struct cg6_layout *sc_physadr;	/* phys addr of h/w */	volatile struct bt_regs *sc_bt;		/* Brooktree registers */	volatile int *sc_fhc;			/* FHC register */	volatile struct cg6_thc *sc_thc;	/* THC registers */	volatile struct cg6_tec_xxx *sc_tec;	/* TEC registers */	short	sc_fhcrev;		/* hardware rev */	short	sc_blanked;		/* true if blanked */	struct	cg6_cursor sc_cursor;	/* software cursor info */	union	bt_cmap sc_cmap;	/* Brooktree color map */};/* autoconfiguration driver */static void	cgsixattach(struct device *, struct device *, void *);struct cfdriver cgsixcd =    { NULL, "cgsix", matchbyname, cgsixattach,      DV_DULL, sizeof(struct cgsix_softc) };/* frame buffer generic driver */static void	cg6_unblank(struct device *);static struct fbdriver cg6_fbdriver = { cg6_unblank };/* * Unlike the bw2 and cg3 drivers, we do not need to provide an rconsole * interface, as the cg6 is fast enough. */extern int fbnode;#define	CGSIX_MAJOR	67		/* XXX */static void cg6_reset __P((struct cgsix_softc *));static void cg6_loadcmap __P((struct cgsix_softc *, int, int));static void cg6_loadomap __P((struct cgsix_softc *));static void cg6_setcursor __P((struct cgsix_softc *));/* set position */static void cg6_loadcursor __P((struct cgsix_softc *));/* set shape *//* * Attach a display. */voidcgsixattach(parent, self, args)	struct device *parent, *self;	void *args;{	register struct cgsix_softc *sc = (struct cgsix_softc *)self;	register struct sbus_attach_args *sa = args;	register int node = sa->sa_ra.ra_node, ramsize, i;	register volatile struct bt_regs *bt;	register volatile struct cg6_layout *p;	sc->sc_fb.fb_major = CGSIX_MAJOR;	/* XXX to be removed */	sc->sc_fb.fb_driver = &cg6_fbdriver;	sc->sc_fb.fb_device = &sc->sc_dev;	sc->sc_fb.fb_type.fb_type = FBTYPE_SUNFAST_COLOR;	sc->sc_fb.fb_type.fb_width = getpropint(node, "width", 1152);	sc->sc_fb.fb_type.fb_height = getpropint(node, "height", 900);	sc->sc_fb.fb_linebytes = getpropint(node, "linebytes", 1152);	ramsize = sc->sc_fb.fb_type.fb_height * sc->sc_fb.fb_linebytes;	sc->sc_fb.fb_type.fb_depth = 8;	sc->sc_fb.fb_type.fb_cmsize = 256;	sc->sc_fb.fb_type.fb_size = ramsize;	printf(": %s, %d x %d", getpropstring(node, "model"),	    sc->sc_fb.fb_type.fb_width, sc->sc_fb.fb_type.fb_height);	/*	 * Dunno what the PROM has mapped, though obviously it must have	 * the video RAM mapped.  Just map what we care about for ourselves	 * (the FHC, THC, and Brooktree registers).	 */	sc->sc_physadr = p = (struct cg6_layout *)sa->sa_ra.ra_paddr;	sc->sc_bt = bt = (volatile struct bt_regs *)	    mapiodev((caddr_t)&p->cg6_bt_un.un_btregs, sizeof *sc->sc_bt);	sc->sc_fhc = (volatile int *)	    mapiodev((caddr_t)&p->cg6_fhc_un.un_fhc, sizeof *sc->sc_fhc);	sc->sc_thc = (volatile struct cg6_thc *)	    mapiodev((caddr_t)&p->cg6_thc_un.un_thc, sizeof *sc->sc_thc);	sc->sc_tec = (volatile struct cg6_tec_xxx *)	    mapiodev((caddr_t)&p->cg6_tec_un.un_tec, sizeof *sc->sc_tec);	sc->sc_fhcrev = (*sc->sc_fhc >> FHC_REV_SHIFT) &	    (FHC_REV_MASK >> FHC_REV_SHIFT);	printf(", rev %d", sc->sc_fhcrev);	/* reset cursor & frame buffer controls */	cg6_reset(sc);	/* grab initial (current) color map (DOES THIS WORK?) */	bt->bt_addr = 0;	for (i = 0; i < 256 * 3; i++)		((char *)&sc->sc_cmap)[i] = bt->bt_cmap >> 24;	/* enable video */	sc->sc_thc->thc_misc |= THC_MISC_VIDEN;	printf("\n");	sbus_establish(&sc->sc_sd, &sc->sc_dev);	if (node == fbnode)		fb_attach(&sc->sc_fb);}intcgsixopen(dev, flags, mode, p)	dev_t dev;	int flags, mode;	struct proc *p;{	int unit = minor(dev);	if (unit >= cgsixcd.cd_ndevs || cgsixcd.cd_devs[unit] == NULL)		return (ENXIO);	return (0);}intcgsixclose(dev, flags, mode, p)	dev_t dev;	int flags, mode;	struct proc *p;{	struct cgsix_softc *sc = cgsixcd.cd_devs[minor(dev)];	cg6_reset(sc);	return (0);}intcgsixioctl(dev, cmd, data, flags, p)	dev_t dev;	int cmd;	register caddr_t data;	int flags;	struct proc *p;{	register struct cgsix_softc *sc = cgsixcd.cd_devs[minor(dev)];	u_int count;	int i, v, error;	union cursor_cmap tcm;	switch (cmd) {	case FBIOGTYPE:		*(struct fbtype *)data = sc->sc_fb.fb_type;		break;	case FBIOGATTR:#define fba ((struct fbgattr *)data)		fba->real_type = sc->sc_fb.fb_type.fb_type;		fba->owner = 0;		/* XXX ??? */		fba->fbtype = sc->sc_fb.fb_type;		fba->sattr.flags = 0;		fba->sattr.emu_type = sc->sc_fb.fb_type.fb_type;		fba->sattr.dev_specific[0] = -1;		fba->emu_types[0] = sc->sc_fb.fb_type.fb_type;		fba->emu_types[1] = -1;#undef fba		break;	case FBIOGETCMAP:		return (bt_getcmap((struct fbcmap *)data, &sc->sc_cmap, 256));	case FBIOPUTCMAP:		/* copy to software map */#define	p ((struct fbcmap *)data)		error = bt_putcmap(p, &sc->sc_cmap, 256);		if (error)			return (error);		/* now blast them into the chip */		/* XXX should use retrace interrupt */		cg6_loadcmap(sc, p->index, p->count);#undef p		break;	case FBIOGVIDEO:		*(int *)data = sc->sc_blanked;		break;	case FBIOSVIDEO:		if (*(int *)data)			cg6_unblank(&sc->sc_dev);		else if (!sc->sc_blanked) {			sc->sc_blanked = 1;			sc->sc_thc->thc_misc &= ~THC_MISC_VIDEN;		}		break;/* these are for both FBIOSCURSOR and FBIOGCURSOR */#define p ((struct fbcursor *)data)#define cc (&sc->sc_cursor)	case FBIOGCURSOR:		/* do not quite want everything here... */		p->set = FB_CUR_SETALL;	/* close enough, anyway */		p->enable = cc->cc_enable;		p->pos = cc->cc_pos;		p->hot = cc->cc_hot;		p->size = cc->cc_size;		/* begin ugh ... can we lose some of this crap?? */		if (p->image != NULL) {			count = cc->cc_size.y * 32 / NBBY;			error = copyout((caddr_t)cc->cc_bits[1],			    (caddr_t)p->image, count);			if (error)				return (error);			error = copyout((caddr_t)cc->cc_bits[0],			    (caddr_t)p->mask, count);			if (error)				return (error);		}		if (p->cmap.red != NULL) {			error = bt_getcmap(&p->cmap,			    (union bt_cmap *)&cc->cc_color, 2);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -