Annotation of researchv9/X11/src/X.V11R1/server/ddx/sun/sunCG2M.c, revision 1.1.1.1

1.1       root        1: /*-
                      2:  * sunCG2M.c --
                      3:  *     Functions to support the sun CG2 board when treated as a monochrome
                      4:  *     frame buffer.
                      5:  *
                      6:  * Copyright (c) 1987 by the Regents of the University of California
                      7:  * Copyright (c) 1987 by Adam de Boor, UC Berkeley
                      8:  *
                      9:  * Permission to use, copy, modify, and distribute this
                     10:  * software and its documentation for any purpose and without
                     11:  * fee is hereby granted, provided that the above copyright
                     12:  * notice appear in all copies.  The University of California
                     13:  * makes no representations about the suitability of this
                     14:  * software for any purpose.  It is provided "as is" without
                     15:  * express or implied warranty.
                     16:  *
                     17:  *
                     18:  */
                     19: #ifndef lint
                     20: static char rcsid[] =
                     21:        "$Header: sunCG2M.c,v 4.4 87/09/11 17:04:55 sun Exp $ SPRITE (Berkeley)";
                     22: #endif lint
                     23: 
                     24: #include    "sun.h"
                     25: #include    "resource.h"
                     26: 
                     27: #include    <sys/mman.h>
                     28: #include    <pixrect/memreg.h>
                     29: #include    <pixrect/cg2reg.h>
                     30: #include    <struct.h>
                     31: 
                     32: extern caddr_t mmap();
                     33: #ifndef _MAP_NEW
                     34: extern caddr_t valloc();
                     35: #endif  _MAP_NEW
                     36: 
                     37: /*-
                     38:  * The cg2 frame buffer is divided into several pieces.
                     39:  *     1) a stack of 8 monochrome bitplanes
                     40:  *     2) an array of 8-bit pixels
                     41:  *     3) a union of these two where modifications are done via RasterOp
                     42:  *         chips
                     43:  *     4) various control registers
                     44:  *     5) a shadow colormap.
                     45:  *
                     46:  * Each of these things is at a given offset from the base of the 4Mb devoted
                     47:  * to each color board. In addition, the mmap() system call insists on the
                     48:  * address and the length to be mapped being aligned on 8K boundaries.
                     49:  */
                     50: struct cg2m_reg {
                     51:     char               pad[4096];  /* The status register is at 0x309000 */
                     52:                                    /* which isn't on an 8K boundary, so we */
                     53:                                    /* have to pad this thing here to make */
                     54:                                    /* the mmaping work... */
                     55:     union {
                     56:        struct cg2statusreg csr;        /* Control/status register */
                     57:        char                pad[4096];  /* This is the amount of room */
                     58:                                        /* dedicated to the status register */
                     59:     }                  u_csr;
                     60: };
                     61: 
                     62: struct cg2m_ppmask {
                     63:     union {
                     64:        unsigned short      ppmask;     /* Per-plane mask */
                     65:        char                pad[8192];  /* Padding to keep the length of */
                     66:                                        /* these registers page-aligned... */
                     67: 
                     68:     } u_ppmask;
                     69: };
                     70: 
                     71: struct cg2m_cmap {
                     72:     union {
                     73:        struct {        /* Shouldn't these be u_char's??? */
                     74:            u_short             redmap[256];    /* Red-component map */
                     75:            u_short             greenmap[256];  /* Green-component map */
                     76:            u_short             bluemap[256];   /* Blue-component map */
                     77:        }                   cmap;
                     78:        char                pad[8192];
                     79:     } u_cmap;
                     80: };
                     81: 
                     82: typedef struct cg2m {
                     83:     union bitplane     *image;     /* The first bitplane -- treated as a */
                     84:                                    /* monochrome frame buffer. */
                     85:     struct cg2m_reg *u_csr;            /* the status register */
                     86:     struct cg2m_ppmask *u_ppmask;      /* the plane mask register */
                     87:     struct cg2m_cmap *u_cmap;          /* the colormap */
                     88: } CG2M, CG2MRec, *CG2MPtr;
                     89: 
                     90: #define CG2M_IMAGE(fb)     ((caddr_t)((fb).image))
                     91: #define CG2M_IMAGEOFF      ((off_t)0x00000000)
                     92: #define CG2M_IMAGELEN      (sizeof(union bitplane))
                     93: #define CG2M_REG(fb)       ((caddr_t)((fb).u_csr))
                     94: #define CG2M_REGOFF        ((off_t)0x00308000)
                     95: #define CG2M_REGLEN        (2*8192)
                     96: #define CG2M_MASK(fb)       ((caddr_t)((fb).u_ppmask))
                     97: #define CG2M_MASKOFF        ((off_t)0x0030A000)
                     98: #define CG2M_MASKLEN        (0x2000)
                     99: #define CG2M_CMAP(fb)      ((caddr_t)((fb).u_cmap))
                    100: #define CG2M_CMAPOFF       ((off_t)0x00310000)
                    101: #define CG2M_CMAPLEN       8192
                    102: 
                    103: /*-
                    104:  *-----------------------------------------------------------------------
                    105:  * sunCG2MSaveScreen --
                    106:  *     Preserve the color screen by turning on or off the video
                    107:  *
                    108:  * Results:
                    109:  *     None.
                    110:  *
                    111:  * Side Effects:
                    112:  *     Video state is switched
                    113:  *
                    114:  *-----------------------------------------------------------------------
                    115:  */
                    116: static Bool
                    117: sunCG2MSaveScreen (pScreen, on)
                    118:     ScreenPtr    pScreen;
                    119:     Bool         on;
                    120: {
                    121:     int                state = on;
                    122: 
                    123:     switch (on) {
                    124:     case SCREEN_SAVER_FORCER:
                    125:        SetTimeSinceLastInputEvent();
                    126:        screenSaved = FALSE;
                    127:        state = 1;
                    128:        break;
                    129:     case SCREEN_SAVER_OFF:
                    130:        screenSaved = FALSE;
                    131:        state = 1;
                    132:        break;
                    133:     case SCREEN_SAVER_ON:
                    134:     default:
                    135:        screenSaved = TRUE;
                    136:        state = 0;
                    137:        break;
                    138:     }
                    139:     ((CG2MPtr)sunFbs[pScreen->myNum].fb)->u_csr->u_csr.csr.video_enab = state;
                    140:     return( TRUE );
                    141: }
                    142: 
                    143: /*-
                    144:  *-----------------------------------------------------------------------
                    145:  * sunCG2MCloseScreen --
                    146:  *     called to ensure video is enabled when server exits.
                    147:  *
                    148:  * Results:
                    149:  *     Screen is unsaved.
                    150:  *
                    151:  * Side Effects:
                    152:  *     None
                    153:  *
                    154:  *-----------------------------------------------------------------------
                    155:  */
                    156: /*ARGSUSED*/
                    157: static Bool
                    158: sunCG2MCloseScreen(i, pScreen)
                    159:     int                i;
                    160:     ScreenPtr  pScreen;
                    161: {
                    162:     return (pScreen->SaveScreen(pScreen, SCREEN_SAVER_OFF));
                    163: }
                    164: 
                    165: /*-
                    166:  *-----------------------------------------------------------------------
                    167:  * sunCG2MResolveColor --
                    168:  *     Resolve an RGB value into some sort of thing we can handle.
                    169:  *     Just looks to see if the intensity of the color is greater than
                    170:  *     1/2 and sets it to 'white' (all ones) if so and 'black' (all zeroes)
                    171:  *     if not.
                    172:  *
                    173:  * Results:
                    174:  *     *pred, *pgreen and *pblue are overwritten with the resolved color.
                    175:  *
                    176:  * Side Effects:
                    177:  *     see above.
                    178:  *
                    179:  *-----------------------------------------------------------------------
                    180:  */
                    181: /*ARGSUSED*/
                    182: static void
                    183: sunCG2MResolveColor(pred, pgreen, pblue, pVisual)
                    184:     unsigned short     *pred;
                    185:     unsigned short     *pgreen;
                    186:     unsigned short     *pblue;
                    187:     VisualPtr          pVisual;
                    188: {
                    189:     *pred = *pgreen = *pblue = 
                    190:         (((39L * *pred +
                    191:            50L * *pgreen +
                    192:            11L * *pblue) >> 8) >= (((1<<8)-1)*50)) ? ~0 : 0;
                    193: }
                    194: 
                    195: /*-
                    196:  *-----------------------------------------------------------------------
                    197:  * sunCG2CreateColormap --
                    198:  *     create a bw colormap
                    199:  *
                    200:  * Results:
                    201:  *     None
                    202:  *
                    203:  * Side Effects:
                    204:  *     allocate two pixels
                    205:  *
                    206:  *-----------------------------------------------------------------------
                    207:  */
                    208: void
                    209: sunCG2CreateColormap(pmap)
                    210:     ColormapPtr        pmap;
                    211: {
                    212:     int        red, green, blue, pix;
                    213: 
                    214:     /* this is a monochrome colormap, it only has two entries, just fill
                    215:      * them in by hand.  If it were a more complex static map, it would be
                    216:      * worth writing a for loop or three to initialize it */
                    217: 
                    218:     /* this will be pixel 0 */
                    219:     red = green = blue = ~0;
                    220:     AllocColor(pmap, &red, &green, &blue, &pix, 0);
                    221: 
                    222:     /* this will be pixel 1 */
                    223:     red = green = blue = 0;
                    224:     AllocColor(pmap, &red, &green, &blue, &pix, 0);
                    225: 
                    226: }
                    227: 
                    228: /*-
                    229:  *-----------------------------------------------------------------------
                    230:  * sunCG2DestroyColormap --
                    231:  *     destroy a bw colormap
                    232:  *
                    233:  * Results:
                    234:  *     None
                    235:  *
                    236:  * Side Effects:
                    237:  *     None
                    238:  *
                    239:  *-----------------------------------------------------------------------
                    240:  */
                    241: /*ARGSUSED*/
                    242: void
                    243: sunCG2DestroyColormap(pmap)
                    244:     ColormapPtr        pmap;
                    245: {
                    246: }
                    247: 
                    248: 
                    249: /*-
                    250:  *-----------------------------------------------------------------------
                    251:  * sunCG2MInit --
                    252:  *     Attempt to find and initialize a cg2 framebuffer used as mono
                    253:  *
                    254:  * Results:
                    255:  *     TRUE if everything went ok. FALSE if not.
                    256:  *
                    257:  * Side Effects:
                    258:  *     Most of the elements of the ScreenRec are filled in. The
                    259:  *     video is enabled for the frame buffer...
                    260:  *
                    261:  *-----------------------------------------------------------------------
                    262:  */
                    263: /*ARGSUSED*/
                    264: static Bool
                    265: sunCG2MInit (index, pScreen, argc, argv)
                    266:     int                  index;        /* The index of pScreen in the ScreenInfo */
                    267:     ScreenPtr    pScreen;      /* The Screen to initialize */
                    268:     int                  argc;         /* The number of the Server's arguments. */
                    269:     char         **argv;       /* The arguments themselves. Don't change! */
                    270: {
                    271:     ColormapPtr          pCmap;
                    272:     
                    273:     if (!mfbScreenInit (index, pScreen,
                    274:                        ((CG2MPtr)sunFbs[index].fb)->image,
                    275:                        sunFbs[index].info.fb_width,
                    276:                        sunFbs[index].info.fb_height, 90, 90))
                    277:        return (FALSE);
                    278: 
                    279:     pScreen->SaveScreen =   sunCG2MSaveScreen;
                    280:     pScreen->RealizeCursor = sunRealizeCursor;
                    281:     pScreen->UnrealizeCursor = sunUnrealizeCursor;
                    282:     pScreen->DisplayCursor = sunDisplayCursor;
                    283:     pScreen->SetCursorPosition = sunSetCursorPosition;
                    284:     pScreen->CursorLimits = sunCursorLimits;
                    285:     pScreen->PointerNonInterestBox = sunPointerNonInterestBox;
                    286:     pScreen->ConstrainCursor = sunConstrainCursor;
                    287:     pScreen->RecolorCursor = sunRecolorCursor;
                    288:     pScreen->ResolveColor = sunCG2MResolveColor;
                    289:     pScreen->CreateColormap = sunCG2CreateColormap;
                    290:     pScreen->DestroyColormap = sunCG2DestroyColormap;
                    291:     pScreen->RegionCreate = miRegionCreate;
                    292:     pScreen->RegionCopy = miRegionCopy;
                    293:     pScreen->RegionDestroy = miRegionDestroy;
                    294:     pScreen->Intersect = miIntersect;
                    295:     pScreen->Inverse = miInverse;
                    296:     pScreen->Union = miUnion;
                    297:     pScreen->Subtract = miSubtract;
                    298:     pScreen->RegionReset = miRegionReset;
                    299:     pScreen->TranslateRegion = miTranslateRegion;
                    300:     pScreen->RectIn = miRectIn;
                    301:     pScreen->PointInRegion = miPointInRegion;
                    302: 
                    303:     pScreen->whitePixel =   0;
                    304:     pScreen->blackPixel =   1;
                    305: 
                    306:     if (CreateColormap(pScreen->defColormap, pScreen,
                    307:                    LookupID(pScreen->rootVisual, RT_VISUALID, RC_CORE),
                    308:                    &pCmap, AllocNone, 0) != Success
                    309:         || pCmap == NULL)
                    310:             FatalError("Can't create colormap in sunCG2MInit()\n");
                    311:     mfbInstallColormap(pCmap);
                    312: 
                    313:     /*
                    314:      * Enable video output...
                    315:      */
                    316:     sunCG2MSaveScreen(pScreen, SCREEN_SAVER_FORCER);
                    317: 
                    318:     sunScreenInit (pScreen);
                    319:     return (TRUE);
                    320: }
                    321: 
                    322: /*-
                    323:  *-----------------------------------------------------------------------
                    324:  * sunCG2MProbe --
                    325:  *     Attempt to find and initialize a cg2 framebuffer used as mono
                    326:  *
                    327:  * Results:
                    328:  *     TRUE if everything went ok. FALSE if not.
                    329:  *
                    330:  * Side Effects:
                    331:  *     Memory is allocated for the frame buffer and the buffer is mapped.
                    332:  *
                    333:  *-----------------------------------------------------------------------
                    334:  */
                    335: Bool
                    336: sunCG2MProbe (pScreenInfo, index, fbNum, argc, argv)
                    337:     ScreenInfo   *pScreenInfo; /* The screenInfo struct */
                    338:     int                  index;        /* The index of pScreen in the ScreenInfo */
                    339:     int                  fbNum;        /* Index into the sunFbData array */
                    340:     int                  argc;         /* The number of the Server's arguments. */
                    341:     char         **argv;       /* The arguments themselves. Don't change! */
                    342: {
                    343:     int          i;
                    344:     int                oldNumScreens;
                    345: 
                    346:     if (sunFbData[fbNum].probeStatus == probedAndFailed) {
                    347:        return FALSE;
                    348:     }
                    349: 
                    350:     if (sunFbData[fbNum].probeStatus == neverProbed) {
                    351:        int         fd;
                    352:        struct fbtype fbType;
                    353:        static CG2MRec    CG2Mfb;
                    354: 
                    355:        if ((fd = sunOpenFrameBuffer(FBTYPE_SUN2COLOR, &fbType, index, fbNum, 
                    356:                    argc, argv)) < 0) {
                    357:            sunFbData[fbNum].probeStatus = probedAndFailed;
                    358:            return FALSE;
                    359:        }
                    360: 
                    361: #ifdef _MAP_NEW
                    362:         if ((int)(CG2Mfb.image = (union bitplane *) mmap ((caddr_t) 0,
                    363:                  CG2M_IMAGELEN, PROT_READ | PROT_WRITE,
                    364:                   MAP_SHARED | _MAP_NEW, fd, CG2M_IMAGEOFF)) == -1) {
                    365:                       Error ("Mapping cg2m.image");
                    366:                       goto bad;
                    367:         }
                    368:         if ((int)(CG2Mfb.u_csr = (struct cg2m_reg *) mmap ((caddr_t) 0,
                    369:                  CG2M_REGLEN, PROT_READ | PROT_WRITE,
                    370:                   MAP_SHARED | _MAP_NEW, fd, CG2M_REGOFF)) == -1) {
                    371:                       Error ("Mapping cg2m.reg");
                    372:                       goto bad;
                    373:         }
                    374:         if ((int)(CG2Mfb.u_ppmask = (struct cg2m_ppmask *) mmap ((caddr_t) 0,
                    375:                  CG2M_MASKLEN, PROT_READ | PROT_WRITE,
                    376:                   MAP_SHARED | _MAP_NEW, fd, CG2M_MASKOFF)) == -1) {
                    377:                       Error ("Mapping cg2m.reg");
                    378:                       goto bad;
                    379:         }
                    380:         if ((int)(CG2Mfb.u_cmap = (struct cg2m_cmap *) mmap ((caddr_t) 0,
                    381:                  CG2M_CMAPLEN, PROT_READ | PROT_WRITE,
                    382:                   MAP_SHARED | _MAP_NEW, fd, CG2M_CMAPOFF)) != -1) {
                    383:                       goto ok;
                    384:         }
                    385:         Error ("Mapping cg2m.cmap");
                    386: #else
                    387:        CG2Mfb.image = (union bitplane *)valloc (CG2M_IMAGELEN + CG2M_REGLEN +
                    388:                                CG2M_MASKLEN + CG2M_CMAPLEN);
                    389:        CG2Mfb.u_csr = (struct cg2m_reg *) ((char *)CG2Mfb.image +
                    390:                                CG2M_IMAGELEN);
                    391:        CG2Mfb.u_ppmask = (struct cg2m_ppmask *) ((char *)CG2Mfb.u_csr +
                    392:                                CG2M_REGLEN);
                    393:        CG2Mfb.u_cmap = (struct cg2m_cmap *) ((char *)CG2Mfb.u_ppmask +
                    394:                                CG2M_MASKLEN);
                    395:        if (CG2Mfb.image == (union bitplane *) NULL) {
                    396:            ErrorF ("Could not allocate room for frame buffer.\n");
                    397:            sunFbData[fbNum].probeStatus = probedAndFailed;
                    398:            return FALSE;
                    399:        }
                    400:        
                    401:        if (mmap (CG2M_IMAGE(CG2Mfb), CG2M_IMAGELEN, PROT_READ | PROT_WRITE,
                    402:                  MAP_SHARED, fd, CG2M_IMAGEOFF) < 0) {
                    403:                      Error ("Mapping cg2m.image");
                    404:                      goto bad;
                    405:        }
                    406:        if (mmap (CG2M_REG(CG2Mfb), CG2M_REGLEN, PROT_READ | PROT_WRITE,
                    407:                  MAP_SHARED, fd, CG2M_REGOFF) < 0) {
                    408:                      Error ("Mapping cg2m.reg");
                    409:                      goto bad;
                    410:        }
                    411:        if (mmap (CG2M_MASK(CG2Mfb), CG2M_MASKLEN, PROT_READ | PROT_WRITE,
                    412:                  MAP_SHARED, fd, CG2M_MASKOFF) < 0) {
                    413:                      Error ("Mapping cg2m.mask");
                    414:                      goto bad;
                    415:        }       
                    416:        if (mmap (CG2M_CMAP(CG2Mfb), CG2M_CMAPLEN, PROT_READ | PROT_WRITE,
                    417:                  MAP_SHARED, fd, CG2M_CMAPOFF) >= 0) {
                    418:                      goto ok;
                    419:        }
                    420:        Error ("Mapping cg2m.cmap");
                    421: #endif _MAP_NEW
                    422: bad:
                    423:        sunFbData[fbNum].probeStatus = probedAndFailed;
                    424:        (void) close (fd);
                    425:        return FALSE;
                    426: 
                    427: ok:
                    428:        /*
                    429:         * Enable only the first plane and make all even pixels be white,
                    430:         * while all odd pixels are black.
                    431:         */
                    432:        CG2Mfb.u_ppmask->u_ppmask.ppmask = 1;
                    433:        CG2Mfb.u_csr->u_csr.csr.update_cmap = 0;
                    434:        for ( i=0; i<256; i+=2 ) {
                    435:            CG2Mfb.u_cmap->u_cmap.cmap.redmap[i] =
                    436:                CG2Mfb.u_cmap->u_cmap.cmap.greenmap[i] =
                    437:                    CG2Mfb.u_cmap->u_cmap.cmap.bluemap[i] = 255;
                    438:            CG2Mfb.u_cmap->u_cmap.cmap.redmap[i+1] =
                    439:                CG2Mfb.u_cmap->u_cmap.cmap.greenmap[i+1] =
                    440:                    CG2Mfb.u_cmap->u_cmap.cmap.bluemap[i+1] = 0;
                    441:        }
                    442:        CG2Mfb.u_csr->u_csr.csr.update_cmap = 1;
                    443:        
                    444:        sunFbs[index].fd = fd;
                    445:        sunFbs[index].info = fbType;
                    446:        sunFbs[index].fb = (pointer) &CG2Mfb;
                    447:        sunFbs[index].EnterLeave = NoopDDA;
                    448:        sunFbData[fbNum].probeStatus = probedAndSucceeded;
                    449:     }
                    450: 
                    451:     oldNumScreens = pScreenInfo->numScreens;
                    452:     i = AddScreen(sunCG2MInit, argc, argv);
                    453:     pScreenInfo->screen[index].CloseScreen = sunCG2MCloseScreen;
                    454:     return (i > oldNumScreens);
                    455: }
                    456: 
                    457: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.