home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / server / ddx / omron / omron88kBm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-29  |  9.1 KB  |  386 lines

  1. /*
  2.  * $XConsortium: omron88kBm.c,v 1.1 91/06/29 13:48:52 xguest Exp $
  3.  *
  4.  * Copyright 1991 by OMRON Corporation
  5.  * 
  6.  * Permission to use, copy, modify, distribute, and sell this software and its
  7.  * documentation for any purpose is hereby granted without fee, provided that
  8.  * the above copyright notice appear in all copies and that both that
  9.  * copyright notice and this permission notice appear in supporting
  10.  * documentation, and that the name of OMRON not be used in advertising or
  11.  * publicity pertaining to distribution of the software without specific,
  12.  * written prior permission.  OMRON makes no representations about the
  13.  * suitability of this software for any purpose.  It is provided "as is"
  14.  * without express or implied warranty.
  15.  *
  16.  * OMRON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  17.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OMRON
  18.  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  19.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  20.  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
  21.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22.  */
  23.  
  24. #ifdef    luna88k
  25. #include "omron.h"
  26.  
  27. #include "omronFb.h"
  28.  
  29. /*
  30. **    color palette 
  31. */
  32. struct pal{
  33.     unsigned char red;
  34.     unsigned char green;
  35.     unsigned char blue;
  36. };
  37.  
  38. static struct pal paldata[256] = {
  39.     {~0,~0,~0}, {0,0,0},
  40.     {~0,~0,~0}, {0,0,0},
  41.     {~0,~0,~0}, {0,0,0},
  42.     {~0,~0,~0}, {0,0,0},
  43.     {~0,~0,~0}, {0,0,0},
  44.     {~0,~0,~0}, {0,0,0},
  45.     {~0,~0,~0}, {0,0,0},
  46.     {~0,~0,~0}, {0,0,0}
  47. };
  48.  
  49. static struct pal palinit[256] = {
  50.     {~0,~0,~0}, {0,0,0},
  51.     {~0,~0,~0}, {0,0,0},
  52.     {~0,~0,~0}, {0,0,0},
  53.     {~0,~0,~0}, {0,0,0},
  54.     {~0,~0,~0}, {0,0,0},
  55.     {~0,~0,~0}, {0,0,0},
  56.     {~0,~0,~0}, {0,0,0},
  57.     {~0,~0,~0}, {0,0,0}
  58. };
  59.  
  60. static struct pal palsave[256];
  61.  
  62. static int      pagesize;
  63.  
  64. static Bool omron88kBmPalCreate();
  65. static void omron88kBmFbClose();
  66. static void omron88kBmPalInit();
  67. static void omron88kBmGetPal();
  68. static void omron88kBmSetPal();
  69.  
  70. Bool
  71. omron88kBmCreate(omron_fb_info)
  72. OmronFbInfoPtr omron_fb_info;
  73. {
  74.     R88kBmRegPtr r88k_bm_reg;
  75.     caddr_t      map_ptr = (caddr_t)0xb1080000;    /* frame buffer i/o port */
  76.  
  77.     pagesize = getpagesize();
  78.  
  79.     /* map fb memoery */
  80.     if ((omron_fb_info->fbfd1 = open("/dev/fb",2)) < 0) {
  81.         Error("Can't open /dev/fb");
  82.         return FALSE;
  83.     }
  84.  
  85.     if ( ioctl(omron_fb_info->fbfd1,FBIOCBATC,(caddr_t *)&map_ptr) < 0 ) {
  86.         Error("ioctl FBIOCBATC error.");
  87.         return FALSE;
  88.     }
  89.  
  90.     omron_fb_info->plane = (char *)0xb10c0008;    
  91.  
  92.     /* map fb control regs */
  93.     if ((omron_fb_info->fbfd2 = open("/dev/allmapfb",2)) < 0) { 
  94.         Error("Can't allocate 88k_bm_reg.");
  95.         return FALSE;
  96.     }
  97.  
  98.     omron_fb_info->fbmapsize =
  99.          (sizeof(struct R88k_bm_fbreg) + (pagesize - 1)) & ~(pagesize- 1);
  100.     r88k_bm_reg = ( R88kBmRegPtr )valloc(omron_fb_info->fbmapsize);
  101.     if(r88k_bm_reg  == ( R88kBmRegPtr ) NULL) {
  102.         Error("Can't allocate 88k_bm_reg.");
  103.         return FALSE;
  104.     }
  105.  
  106.     if(mmap(r88k_bm_reg, omron_fb_info->fbmapsize, PROT_WRITE, MAP_SHARED,
  107.             omron_fb_info->fbfd2,0) < 0 ) {
  108.         Error("Can't mmap /dev/allmapfb");
  109.         free(r88k_bm_reg);
  110.         return FALSE;
  111.     }
  112.  
  113.     omron_fb_info->fbmap = (char *)r88k_bm_reg;
  114.     omron_fb_info->refresh_reg = &(r88k_bm_reg->refresh.reg);
  115.  
  116.     if (!omron88kBmPalCreate(omron_fb_info)) {
  117.         omron88kBmFbClose(omron_fb_info);
  118.         return FALSE;
  119.     }
  120.  
  121.     if (omron_fb_info->fb_type == DT_PLASMA)
  122.         *(omron_fb_info->refresh_reg) = 0x100000;
  123.     else if (omron_fb_info->fb_type == DT_BM8)
  124.         *(omron_fb_info->refresh_reg) = 0xff07f7e6;
  125.     else
  126.         *(omron_fb_info->refresh_reg) = 0xff07f7e5;
  127.  
  128.     return TRUE;
  129. }
  130.  
  131.  
  132. static Bool
  133. omron88kBmSaveScreen(pScreen, on)
  134. ScreenPtr     pScreen;
  135. Bool          on;
  136. {
  137. static int omronScreenIsSaved = FALSE;
  138.     struct pal savepal[256];     
  139.     OmronFbInfoPtr pFbInfo =
  140.         (OmronFbInfoPtr)pScreen->devPrivates[omronScreenIndex].ptr;
  141.  
  142.     if (on != SCREEN_SAVER_ON) {
  143.         omronSetLastEventTime();
  144.         if(omronScreenIsSaved == TRUE) {
  145.             omron88kBmSetPal(pFbInfo, palsave);
  146.             omronScreenIsSaved = FALSE;
  147.         }
  148.         return TRUE;
  149.     }
  150.  
  151.     bzero(savepal, sizeof(savepal));
  152.     omron88kBmSetPal(pFbInfo, savepal);
  153.     omronScreenIsSaved = TRUE;
  154.     return TRUE;
  155. }
  156.  
  157. Bool
  158. omron88kBmInit(index, pScreen, argc, argv)
  159.     int           index;
  160.     ScreenPtr     pScreen;
  161.     int           argc;
  162.     char          **argv;
  163. {
  164.     OmronFbInfoPtr pFbInfo;
  165.     extern miPointerScreenFuncRec  omronPointerScreenFuncs;
  166.     
  167.     pFbInfo = (OmronFbInfoPtr) pScreen->devPrivates[omronScreenIndex].ptr;
  168.  
  169.     omron88kBmPalInit(pFbInfo);
  170.  
  171.     if (!monitorResolution) {
  172.         if (pFbInfo->fb_type == DT_PLASMA)
  173.             monitorResolution = PLASMA_TV_RESOLUTION;
  174.         else
  175.             monitorResolution = MONO_TV_RESOLUTION; 
  176.     }
  177.  
  178.     if(!mfbScreenInit(pScreen,(pointer)pFbInfo->plane,
  179.             pFbInfo->scr_width,pFbInfo->scr_height,
  180.             monitorResolution,monitorResolution,pFbInfo->fb_width)){
  181.         ErrorF("mfbScreenInit error.\n");
  182.         return FALSE;
  183.     }
  184.  
  185.        pScreen->whitePixel = 0;
  186.        pScreen->blackPixel = 1;
  187.  
  188.     miDCInitialize (pScreen, &omronPointerScreenFuncs);
  189.  
  190.     mfbCreateDefColormap(pScreen);
  191.  
  192.     pScreen->SaveScreen = omron88kBmSaveScreen;
  193.  
  194.     omron88kBmSaveScreen(pScreen, SCREEN_SAVER_FORCER);
  195.  
  196.     return TRUE;
  197.  
  198. }
  199.  
  200. static void
  201. omron88kBmFbClose(omron_fb_info)
  202. OmronFbInfoPtr omron_fb_info;
  203. {
  204.     if(munmap(omron_fb_info->fbmap,omron_fb_info->fbmapsize) < 0) {
  205.         Error("Can't munmap bm_reg.");
  206.     }
  207.     free(omron_fb_info->fbmap);
  208.  
  209.     (void)close(omron_fb_info->fbfd1);
  210.     (void)close(omron_fb_info->fbfd2);
  211. }
  212.  
  213. static void
  214. omron88kBmPalClose(omron_fb_info)
  215. OmronFbInfoPtr omron_fb_info;
  216. {
  217.     union palette_bm8 *r88k_bm8_pal;
  218.  
  219.     omron88kBmSetPal(omron_fb_info, paldata);
  220.  
  221.     if(omron_fb_info->fb_type == DT_BM8) {
  222.         r88k_bm8_pal = (union palette_bm8 *)(omron_fb_info->palmap);
  223.         r88k_bm8_pal->reg.addr = 0x4L;
  224.         r88k_bm8_pal->reg.command = 0x1L;
  225.     } else if(omron_fb_info->fb_type == DT_PLASMA) {
  226.         *(omron_fb_info->refresh_reg) = 0;
  227.     }
  228.  
  229.     if (munmap(omron_fb_info->palmap, omron_fb_info->palmapsize) < 0) {
  230.         Error("Can't munmap palette.");
  231.     }
  232.  
  233.     free(omron_fb_info->palmap);
  234.     (void)close(omron_fb_info->palfd);
  235. }
  236.  
  237.  
  238. static Bool
  239. omron88kBmPalCreate(omron_fb_info)
  240. OmronFbInfoPtr omron_fb_info;
  241. {
  242.     union palette_bm8 *r88k_bm8_pal;
  243.  
  244.     if ((omron_fb_info->palfd = open("/dev/palette",2)) < 0) {
  245.         Error("Can't open /dev/palette");
  246.         return FALSE;
  247.     }
  248.  
  249.     if(omron_fb_info->fb_type == DT_BM8) {    /* BM8 */
  250.         omron_fb_info->palmapsize =
  251.             (sizeof(union palette_bm8) + (pagesize - 1)) & ~(pagesize - 1);
  252.     } else {    /* BM */
  253.         omron_fb_info->palmapsize =
  254.             (sizeof(union palette) + (pagesize - 1)) & ~(pagesize - 1);
  255.     }
  256.  
  257.     omron_fb_info->palmap = valloc(omron_fb_info->palmapsize);
  258.  
  259.     if(omron_fb_info->palmap  == (char *) NULL) {
  260.         Error("Can't allocate palette.");
  261.         return FALSE;    
  262.     }
  263.  
  264.     if (mmap(omron_fb_info->palmap, omron_fb_info->palmapsize,
  265.              (PROT_WRITE | PROT_READ),MAP_SHARED, omron_fb_info->palfd, 0) < 0) { 
  266.         Error("Can't mmap palette.");
  267.         free(omron_fb_info->palmap);
  268.         return FALSE;
  269.     }    
  270.  
  271.     if(ioctl(omron_fb_info->palfd, PLTIOCUND, 0) < 0) {
  272.         Error("ioctl PLTIOCUND error.");
  273.         return FALSE;
  274.     }
  275.  
  276.     if(omron_fb_info->fb_type == DT_BM8) {    /* BM8 */
  277.         r88k_bm8_pal = (union palette_bm8 *)(omron_fb_info->palmap);
  278.         r88k_bm8_pal->reg.addr    = 0x04;
  279.         r88k_bm8_pal->reg.command = (1 << omron_fb_info->fb_depth) - 1;
  280.         r88k_bm8_pal->reg.addr    = 0x06;
  281.         r88k_bm8_pal->reg.command = 0x40;
  282.     }
  283.  
  284.     omron88kBmGetPal(omron_fb_info, paldata);
  285.  
  286.     return TRUE; 
  287. }
  288.  
  289.  
  290. static void
  291. omron88kBmPalInit(omron_fb_info)
  292. OmronFbInfoPtr omron_fb_info;
  293. {
  294.     bcopy(palinit, palsave, sizeof(palinit));
  295.     omron88kBmSetPal(omron_fb_info, palsave);
  296. }
  297.  
  298.  
  299. static void
  300. omron88kBmSetPal(omron_fb_info, pal)
  301. OmronFbInfoPtr omron_fb_info;
  302. struct pal *pal;
  303. {
  304.     union palette       *r88k_bm_pal;
  305.     union palette_bm8  *r88k_bm8_pal;
  306.     register int       i, j;
  307.     unsigned char      *palp;
  308.  
  309.     if(omron_fb_info->fb_type == DT_BM8) {    /* BM8 */
  310.         r88k_bm8_pal = (union palette_bm8 *)(omron_fb_info->palmap);
  311.         for (i = 0; i < 256; i++) {
  312.             palp = &pal++->red;
  313.             r88k_bm8_pal->reg.addr = i;
  314.             for (j = 0; j < 3; j++) {
  315.                 r88k_bm8_pal->reg.coldata = *palp++;
  316.             }
  317.         }
  318.     } else {
  319.         r88k_bm_pal = (union palette *)(omron_fb_info->palmap);
  320.         /* restore palette data */
  321.         for (i = 0; i < 16; i++) {
  322.             palp = &pal++->red;
  323.             r88k_bm_pal->reg.addr = i << 4;
  324.             for (j = 0; j < 3; j++)
  325.                 r88k_bm_pal->reg.coldata = *palp++;
  326.         }
  327.     }
  328. }
  329.  
  330.  
  331. static void
  332. omron88kBmGetPal(omron_fb_info, pal)
  333. OmronFbInfoPtr omron_fb_info;
  334. struct pal *pal;
  335. {
  336.     union palette_bm8  *r88k_bm8_pal;
  337.     register    int    i,j;
  338.     unsigned char    *palp;
  339.  
  340.     if(omron_fb_info->fb_type == DT_BM8) {    /* BM8 */
  341.         r88k_bm8_pal = (union palette_bm8 *)(omron_fb_info->palmap);
  342.  
  343.         /* save the CPU ROM palette setting */
  344.         for (i = 0; i < 256; i++) {
  345.             palp = &pal++->red;
  346.             r88k_bm8_pal->reg.addr = i;
  347.             for (j = 0; j < 3; j++) {
  348.                 *palp++ = r88k_bm8_pal->reg.coldata;
  349.             }
  350.         }
  351.     }
  352. }
  353.  
  354.  
  355. static void
  356. omron88kBmFbClear(omron_fb_info)
  357. OmronFbInfoPtr omron_fb_info;
  358. {
  359.     register int *f;
  360.     register int nw,height;
  361.     int nwidth,nlwidth,nlwExtra;
  362.  
  363.     f = (int *)omron_fb_info->plane;
  364.     nlwidth  = (omron_fb_info->fb_width)>>5;
  365.     nwidth   = (omron_fb_info->scr_width)>>5;
  366.     nlwExtra = nlwidth - nwidth;
  367.     height =omron_fb_info->scr_height;
  368.  
  369.     while(height--) {
  370.         nw = nwidth;
  371.         while(nw--)
  372.             *f++ = 0;
  373.         f += nlwExtra;
  374.     }
  375. }
  376.  
  377. void
  378. omron88kBmGiveUp(omron_fb_info)
  379. OmronFbInfoPtr omron_fb_info;
  380. {
  381.     omron88kBmFbClear(omron_fb_info);
  382.     omron88kBmFbClose(omron_fb_info);
  383.     omron88kBmPalClose(omron_fb_info);
  384. }
  385. #endif
  386.