|
|
1.1 ! root 1: /*- ! 2: * sunCG4C.c -- ! 3: * Functions to support the sun CG4 board as a memory frame buffer. ! 4: */ ! 5: ! 6: /************************************************************ ! 7: Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA. ! 8: ! 9: All Rights Reserved ! 10: ! 11: Permission to use, copy, modify, and distribute this ! 12: software and its documentation for any purpose and without ! 13: fee is hereby granted, provided that the above copyright no- ! 14: tice appear in all copies and that both that copyright no- ! 15: tice and this permission notice appear in supporting docu- ! 16: mentation, and that the names of Sun or MIT not be used in ! 17: advertising or publicity pertaining to distribution of the ! 18: software without specific prior written permission. Sun and ! 19: M.I.T. make no representations about the suitability of this ! 20: software for any purpose. It is provided "as is" without any ! 21: express or implied warranty. ! 22: ! 23: SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, ! 24: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- ! 25: NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI- ! 26: ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 27: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR ! 28: PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR ! 29: OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH ! 30: THE USE OR PERFORMANCE OF THIS SOFTWARE. ! 31: ! 32: ********************************************************/ ! 33: ! 34: #ifndef lint ! 35: static char sccsid[] = "@(#)sunCG4C.c 1.4 6/1/87 Copyright 1987 Sun Micro"; ! 36: #endif ! 37: ! 38: #include "sun.h" ! 39: ! 40: #include <sys/mman.h> ! 41: #include <pixrect/memreg.h> ! 42: #include <sundev/cg4reg.h> ! 43: #include "colormap.h" ! 44: #include "colormapst.h" ! 45: #include "resource.h" ! 46: #include <struct.h> ! 47: ! 48: /*- ! 49: * The cg4 frame buffer is divided into several pieces. ! 50: * 1) an array of 8-bit pixels ! 51: * 2) a one-bit deep overlay plane ! 52: * 3) an enable plane ! 53: * 4) a colormap and status register ! 54: * ! 55: * XXX - put the cursor in the overlay plane ! 56: */ ! 57: #define CG4_HEIGHT 900 ! 58: #define CG4_WIDTH 1152 ! 59: ! 60: typedef struct cg4c { ! 61: u_char mpixel[128*1024]; /* bit-per-pixel memory */ ! 62: u_char epixel[128*1024]; /* enable plane */ ! 63: u_char cpixel[CG4_HEIGHT][CG4_WIDTH]; /* byte-per-pixel memory */ ! 64: } CG4C, CG4CRec, *CG4CPtr; ! 65: ! 66: #define CG4C_IMAGE(fb) ((caddr_t)(&(fb)->cpixel)) ! 67: #define CG4C_IMAGEOFF ((off_t)0x0) ! 68: #define CG4C_IMAGELEN (((CG4_HEIGHT*CG4_WIDTH + 8191)/8192)*8192) ! 69: #define CG4C_MONO(fb) ((caddr_t)(&(fb)->mpixel)) ! 70: #define CG4C_MONOLEN (128*1024) ! 71: #define CG4C_ENABLE(fb) ((caddr_t)(&(fb)->epixel)) ! 72: #define CG4C_ENBLEN CG4C_MONOLEN ! 73: ! 74: static CG4CPtr CG4Cfb = NULL; ! 75: ! 76: /* XXX - next line means only one CG4 - fix this */ ! 77: static ColormapPtr sunCG4CInstalledMap; ! 78: ! 79: extern int TellLostMap(), TellGainedMap(); ! 80: ! 81: static void ! 82: sunCG4CUpdateColormap(pScreen, index, count, rmap, gmap, bmap) ! 83: ScreenPtr pScreen; ! 84: int index, count; ! 85: u_char *rmap, *gmap, *bmap; ! 86: { ! 87: struct fbcmap sunCmap; ! 88: ! 89: sunCmap.index = index; ! 90: sunCmap.count = count; ! 91: sunCmap.red = &rmap[index]; ! 92: sunCmap.green = &gmap[index]; ! 93: sunCmap.blue = &bmap[index]; ! 94: ! 95: #ifdef SUN_WINDOWS ! 96: if (sunUseSunWindows()) { ! 97: static Pixwin *pw = 0; ! 98: ! 99: if (! pw) { ! 100: if ( ! (pw = pw_open(windowFd)) ) ! 101: FatalError( "sunCG4CUpdateColormap: pw_open failed\n" ); ! 102: pw_setcmsname(pw, "X.V11"); ! 103: } ! 104: pw_putcolormap( ! 105: pw, index, count, &rmap[index], &gmap[index], &bmap[index]); ! 106: } ! 107: #endif SUN_WINDOWS ! 108: ! 109: if (ioctl(sunFbs[pScreen->myNum].fd, FBIOPUTCMAP, &sunCmap) < 0) { ! 110: perror("sunCG4CUpdateColormap"); ! 111: FatalError( "sunCG4CUpdateColormap: FBIOPUTCMAP failed\n" ); ! 112: } ! 113: } ! 114: ! 115: /*- ! 116: *----------------------------------------------------------------------- ! 117: * sunCG4CSaveScreen -- ! 118: * Preserve the color screen by turning on or off the video ! 119: * ! 120: * Results: ! 121: * None. ! 122: * ! 123: * Side Effects: ! 124: * Video state is switched ! 125: * ! 126: *----------------------------------------------------------------------- ! 127: */ ! 128: static Bool ! 129: sunCG4CSaveScreen (pScreen, on) ! 130: ScreenPtr pScreen; ! 131: Bool on; ! 132: { ! 133: int state = on; ! 134: ! 135: switch (on) { ! 136: case SCREEN_SAVER_FORCER: ! 137: SetTimeSinceLastInputEvent(); ! 138: screenSaved = FALSE; ! 139: state = 1; ! 140: break; ! 141: case SCREEN_SAVER_OFF: ! 142: screenSaved = FALSE; ! 143: state = 1; ! 144: break; ! 145: case SCREEN_SAVER_ON: ! 146: default: ! 147: screenSaved = TRUE; ! 148: state = 0; ! 149: break; ! 150: } ! 151: (void) ioctl(sunFbs[pScreen->myNum].fd, FBIOSVIDEO, &state); ! 152: return( TRUE ); ! 153: } ! 154: ! 155: /*- ! 156: *----------------------------------------------------------------------- ! 157: * sunCG4CCloseScreen -- ! 158: * called to ensure video is enabled when server exits. ! 159: * ! 160: * Results: ! 161: * Screen is unsaved. ! 162: * ! 163: * Side Effects: ! 164: * None ! 165: * ! 166: *----------------------------------------------------------------------- ! 167: */ ! 168: /*ARGSUSED*/ ! 169: static Bool ! 170: sunCG4CCloseScreen(i, pScreen) ! 171: int i; ! 172: ScreenPtr pScreen; ! 173: { ! 174: sunCG4CInstalledMap = NULL; ! 175: return (pScreen->SaveScreen(pScreen, SCREEN_SAVER_OFF)); ! 176: } ! 177: ! 178: /*- ! 179: *----------------------------------------------------------------------- ! 180: * sunCG4CInstallColormap -- ! 181: * Install given colormap. ! 182: * ! 183: * Results: ! 184: * None ! 185: * ! 186: * Side Effects: ! 187: * Existing map is uninstalled. ! 188: * All clients requesting ColormapNotify are notified ! 189: * ! 190: *----------------------------------------------------------------------- ! 191: */ ! 192: static void ! 193: sunCG4CInstallColormap(cmap) ! 194: ColormapPtr cmap; ! 195: { ! 196: register int i; ! 197: register Entry *pent = cmap->red; ! 198: u_char rmap[256], gmap[256], bmap[256]; ! 199: ! 200: if (cmap == sunCG4CInstalledMap) ! 201: return; ! 202: if (sunCG4CInstalledMap) ! 203: WalkTree(sunCG4CInstalledMap->pScreen, TellLostMap, ! 204: (char *) &(sunCG4CInstalledMap->mid)); ! 205: for (i = 0; i < cmap->pVisual->ColormapEntries; i++) { ! 206: if (pent->fShared) { ! 207: rmap[i] = pent->co.shco.red->color >> 8; ! 208: gmap[i] = pent->co.shco.green->color >> 8; ! 209: bmap[i] = pent->co.shco.blue->color >> 8; ! 210: } ! 211: else { ! 212: rmap[i] = pent->co.local.red >> 8; ! 213: gmap[i] = pent->co.local.green >> 8; ! 214: bmap[i] = pent->co.local.blue >> 8; ! 215: } ! 216: pent++; ! 217: } ! 218: sunCG4CInstalledMap = cmap; ! 219: sunCG4CUpdateColormap(cmap->pScreen, 0, 256, rmap, gmap, bmap); ! 220: WalkTree(cmap->pScreen, TellGainedMap, (char *) &(cmap->mid)); ! 221: } ! 222: ! 223: /*- ! 224: *----------------------------------------------------------------------- ! 225: * sunCG4CUninstallColormap -- ! 226: * Uninstall given colormap. ! 227: * ! 228: * Results: ! 229: * None ! 230: * ! 231: * Side Effects: ! 232: * default map is installed ! 233: * All clients requesting ColormapNotify are notified ! 234: * ! 235: *----------------------------------------------------------------------- ! 236: */ ! 237: static void ! 238: sunCG4CUninstallColormap(cmap) ! 239: ColormapPtr cmap; ! 240: { ! 241: if (cmap == sunCG4CInstalledMap) { ! 242: Colormap defMapID = cmap->pScreen->defColormap; ! 243: ! 244: if (cmap->mid != defMapID) { ! 245: ColormapPtr defMap = (ColormapPtr) LookupID(defMapID, RT_COLORMAP, RC_CORE); ! 246: ! 247: if (defMap) ! 248: sunCG4CInstallColormap(defMap); ! 249: else ! 250: ErrorF("sunCG4C: Can't find default colormap\n"); ! 251: } ! 252: } ! 253: } ! 254: ! 255: /*- ! 256: *----------------------------------------------------------------------- ! 257: * sunCG4CListInstalledColormaps -- ! 258: * Fills in the list with the IDs of the installed maps ! 259: * ! 260: * Results: ! 261: * Returns the number of IDs in the list ! 262: * ! 263: * Side Effects: ! 264: * None ! 265: * ! 266: *----------------------------------------------------------------------- ! 267: */ ! 268: /*ARGSUSED*/ ! 269: static int ! 270: sunCG4CListInstalledColormaps(pScreen, pCmapList) ! 271: ScreenPtr pScreen; ! 272: Colormap *pCmapList; ! 273: { ! 274: *pCmapList = sunCG4CInstalledMap->mid; ! 275: return (1); ! 276: } ! 277: ! 278: ! 279: /*- ! 280: *----------------------------------------------------------------------- ! 281: * sunCG4CStoreColors -- ! 282: * Sets the pixels in pdefs into the specified map. ! 283: * ! 284: * Results: ! 285: * None ! 286: * ! 287: * Side Effects: ! 288: * None ! 289: * ! 290: *----------------------------------------------------------------------- ! 291: */ ! 292: static void ! 293: sunCG4CStoreColors(pmap, ndef, pdefs) ! 294: ColormapPtr pmap; ! 295: int ndef; ! 296: xColorItem *pdefs; ! 297: { ! 298: switch (pmap->class) { ! 299: case PseudoColor: ! 300: if (pmap == sunCG4CInstalledMap) { ! 301: /* We only have a single colormap */ ! 302: u_char rmap[256], gmap[256], bmap[256]; ! 303: ! 304: while (ndef--) { ! 305: register unsigned index = pdefs->pixel&0xff; ! 306: ! 307: /* PUTCMAP assumes colors to be assigned start at 0 */ ! 308: rmap[index] = (pdefs->red) >> 8; ! 309: gmap[index] = (pdefs->green) >> 8; ! 310: bmap[index] = (pdefs->blue) >> 8; ! 311: sunCG4CUpdateColormap(pmap->pScreen, ! 312: index, 1, rmap, gmap, bmap); ! 313: pdefs++; ! 314: } ! 315: } ! 316: break; ! 317: case DirectColor: ! 318: default: ! 319: ErrorF("sunCG4CStoreColors: bad class %d\n", pmap->class); ! 320: break; ! 321: } ! 322: } ! 323: ! 324: /*- ! 325: *----------------------------------------------------------------------- ! 326: * sunCG4CResolvePseudoColor -- ! 327: * Adjust specified RGB values to closest values hardware can do. ! 328: * ! 329: * Results: ! 330: * Args are modified. ! 331: * ! 332: * Side Effects: ! 333: * None ! 334: * ! 335: *----------------------------------------------------------------------- ! 336: */ ! 337: /*ARGSUSED*/ ! 338: static void ! 339: sunCG4CResolvePseudoColor(pRed, pGreen, pBlue, pVisual) ! 340: CARD16 *pRed, *pGreen, *pBlue; ! 341: VisualPtr pVisual; ! 342: { ! 343: *pRed &= 0xff00; ! 344: *pGreen &= 0xff00; ! 345: *pBlue &= 0xff00; ! 346: } ! 347: ! 348: /*- ! 349: *----------------------------------------------------------------------- ! 350: * sunCG4CInit -- ! 351: * Attempt to find and initialize a cg4 framebuffer used as mono ! 352: * ! 353: * Results: ! 354: * TRUE if everything went ok. FALSE if not. ! 355: * ! 356: * Side Effects: ! 357: * Most of the elements of the ScreenRec are filled in. Memory is ! 358: * allocated for the frame buffer and the buffer is mapped. The ! 359: * video is enabled for the frame buffer... ! 360: * ! 361: *----------------------------------------------------------------------- ! 362: */ ! 363: /*ARGSUSED*/ ! 364: static Bool ! 365: sunCG4CInit (index, pScreen, argc, argv) ! 366: int index; /* The index of pScreen in the ScreenInfo */ ! 367: ScreenPtr pScreen; /* The Screen to initialize */ ! 368: int argc; /* The number of the Server's arguments. */ ! 369: char **argv; /* The arguments themselves. Don't change! */ ! 370: { ! 371: CARD16 zero = 0, ones = ~0; ! 372: #ifdef notdef ! 373: u_char rmap[256], gmap[256], bmap[256]; ! 374: #endif ! 375: ! 376: if (!cfbScreenInit (index, pScreen, CG4Cfb->cpixel, ! 377: sunFbs[index].info.fb_width, ! 378: sunFbs[index].info.fb_height, 90)) ! 379: return (FALSE); ! 380: ! 381: pScreen->SaveScreen = sunCG4CSaveScreen; ! 382: pScreen->RealizeCursor = sunRealizeCursor; ! 383: pScreen->UnrealizeCursor = sunUnrealizeCursor; ! 384: pScreen->DisplayCursor = sunDisplayCursor; ! 385: pScreen->SetCursorPosition = sunSetCursorPosition; ! 386: pScreen->CursorLimits = sunCursorLimits; ! 387: pScreen->PointerNonInterestBox = sunPointerNonInterestBox; ! 388: pScreen->ConstrainCursor = sunConstrainCursor; ! 389: pScreen->RecolorCursor = sunRecolorCursor; ! 390: ! 391: #ifdef STATIC_COLOR ! 392: pScreen->InstallColormap = NoopDDA; ! 393: pScreen->UninstallColormap = NoopDDA; ! 394: pScreen->ListInstalledColormaps = (int (*)())NoopDDA; ! 395: pScreen->StoreColors = NoopDDA; ! 396: pScreen->ResolveColor = cfbResolveStaticColor; ! 397: #else STATIC_COLOR ! 398: pScreen->InstallColormap = sunCG4CInstallColormap; ! 399: pScreen->UninstallColormap = sunCG4CUninstallColormap; ! 400: pScreen->ListInstalledColormaps = sunCG4CListInstalledColormaps; ! 401: pScreen->StoreColors = sunCG4CStoreColors; ! 402: pScreen->ResolveColor = sunCG4CResolvePseudoColor; ! 403: #endif ! 404: ! 405: #ifdef notdef ! 406: /* ! 407: * Fill the color map with a color cube ! 408: */ ! 409: for (i = 0; i < 256; i++) { ! 410: rmap[i] = (i & 0x7) << 5; ! 411: gmap[i] = (i & 0x38) << 2; ! 412: bmap[i] = (i & 0xc0); ! 413: } ! 414: ! 415: sunCG4CUpdateColormap(pScreenInfo->screen[index], 0, 256, rmap, gmap, bmap); ! 416: #endif ! 417: ! 418: { ! 419: ColormapPtr cmap = (ColormapPtr)LookupID(pScreen->defColormap, RT_COLORMAP, RC_CORE); ! 420: ! 421: if (!cmap) ! 422: FatalError("Can't find default colormap\n"); ! 423: if (AllocColor(cmap, &ones, &ones, &ones, &(pScreen->whitePixel), 0) ! 424: || AllocColor(cmap, &zero, &zero, &zero, &(pScreen->blackPixel), 0)) ! 425: FatalError("Can't alloc black & white pixels in cfbScreeninit\n"); ! 426: sunCG4CInstallColormap(cmap); ! 427: } ! 428: ! 429: ! 430: sunCG4CSaveScreen( pScreen, SCREEN_SAVER_FORCER ); ! 431: sunScreenInit (pScreen); ! 432: return (TRUE); ! 433: } ! 434: ! 435: /*- ! 436: *-------------------------------------------------------------- ! 437: * sunCG4CSwitch -- ! 438: * Enable or disable color plane ! 439: * ! 440: * Results: ! 441: * Color plane enabled for select =0, disabled otherwise. ! 442: * ! 443: *-------------------------------------------------------------- ! 444: */ ! 445: static void ! 446: sunCG4CSwitch (pScreen, select) ! 447: ScreenPtr pScreen; ! 448: u_char select; ! 449: { ! 450: int index; ! 451: register int j; ! 452: ! 453: index = pScreen->myNum; ! 454: CG4Cfb = (CG4CPtr) sunFbs[index].fb; ! 455: ! 456: for (j = 0; j < 128*1024; j++) ! 457: CG4Cfb->epixel[j] = (!select) ? 0 : 0xff; ! 458: } ! 459: ! 460: /*- ! 461: *----------------------------------------------------------------------- ! 462: * sunCG4CProbe -- ! 463: * Attempt to find and initialize a cg4 framebuffer used as mono ! 464: * ! 465: * Results: ! 466: * TRUE if everything went ok. FALSE if not. ! 467: * ! 468: * Side Effects: ! 469: * Memory is allocated for the frame buffer and the buffer is mapped. ! 470: * ! 471: *----------------------------------------------------------------------- ! 472: */ ! 473: Bool ! 474: sunCG4CProbe (pScreenInfo, index, fbNum, argc, argv) ! 475: ScreenInfo *pScreenInfo; /* The screenInfo struct */ ! 476: int index; /* The index of pScreen in the ScreenInfo */ ! 477: int fbNum; /* Index into the sunFbData array */ ! 478: int argc; /* The number of the Server's arguments. */ ! 479: char **argv; /* The arguments themselves. Don't change! */ ! 480: { ! 481: int i, oldNumScreens; ! 482: ! 483: if (sunFbData[fbNum].probeStatus == probedAndFailed) { ! 484: return FALSE; ! 485: } ! 486: ! 487: if (sunFbData[fbNum].probeStatus == neverProbed) { ! 488: int fd; ! 489: struct fbtype fbType; ! 490: ! 491: if ((fd = sunOpenFrameBuffer(FBTYPE_SUN4COLOR, &fbType, index, fbNum, ! 492: argc, argv)) < 0) { ! 493: sunFbData[fbNum].probeStatus = probedAndFailed; ! 494: return FALSE; ! 495: } ! 496: ! 497: #ifdef _MAP_NEW ! 498: if ((int)(CG4Cfb = (CG4CPtr) mmap((caddr_t) 0, ! 499: CG4C_MONOLEN + CG4C_ENBLEN + CG4C_IMAGELEN, ! 500: PROT_READ | PROT_WRITE, ! 501: MAP_SHARED | _MAP_NEW, fd, 0)) == -1) { ! 502: Error("Mapping cg4c"); ! 503: sunFbData[fbNum].probeStatus = probedAndFailed; ! 504: (void) close(fd); ! 505: return FALSE; ! 506: } ! 507: #else _MAP_NEW ! 508: CG4Cfb = (CG4CPtr) valloc(CG4C_MONOLEN + CG4C_ENBLEN + CG4C_IMAGELEN); ! 509: if (CG4Cfb == (CG4CPtr) NULL) { ! 510: ErrorF("Could not allocate room for frame buffer.\n"); ! 511: sunFbData[fbNum].probeStatus = probedAndFailed; ! 512: return FALSE; ! 513: } ! 514: ! 515: if (mmap((caddr_t) CG4Cfb, CG4C_MONOLEN + CG4C_ENBLEN + CG4C_IMAGELEN, ! 516: PROT_READ | PROT_WRITE, ! 517: MAP_SHARED, fd, 0) < 0) { ! 518: Error("Mapping cg4c"); ! 519: sunFbData[fbNum].probeStatus = probedAndFailed; ! 520: (void) close(fd); ! 521: return FALSE; ! 522: } ! 523: #endif _MAP_NEW ! 524: ! 525: sunFbs[index].fd = fd; ! 526: sunFbs[index].info = fbType; ! 527: sunFbs[index].fb = (pointer) CG4Cfb; ! 528: sunFbs[index].EnterLeave = sunCG4CSwitch; ! 529: sunFbData[fbNum].probeStatus = probedAndSucceeded; ! 530: ! 531: } ! 532: ! 533: /* ! 534: * If we've ever successfully probed this device, do the following. ! 535: */ ! 536: ! 537: oldNumScreens = pScreenInfo->numScreens; ! 538: i = AddScreen(sunCG4CInit, argc, argv); ! 539: pScreenInfo->screen[index].CloseScreen = sunCG4CCloseScreen; ! 540: /* Now set the enable plane for color */ ! 541: if (index == 0) sunCG4CSwitch (&(pScreenInfo->screen[0]), 0); ! 542: ! 543: return (i > oldNumScreens); ! 544: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.