XF68_FBDev patch: TrueColor fixed

Gerd Knorr (kraxel@goldbach.isdn.cs.tu-berlin.de)
Sat, 29 Aug 1998 22:33:34 +0200 (CEST)


Hi !

Got XF68_FBDev working with TrueColor (16+32 bpp) on i386 today. Tested
with vesafb and kgicon. Patch below, glibc binary at
http://user.cs.tu-berlin.de/~kraxel/linux/#fb

Attention: compiler problems continue: gcc 2.7.2.3 FAILED to build a
working binary, I used egcs-1.0.2 to build the Server.

Gerd

----------------------------- cut here -------------------------------
diff -u ./xc/config/cf/site.def.orig ./xc/config/cf/site.def
--- ./xc/config/cf/site.def.orig Sat Aug 29 10:58:46 1998
+++ ./xc/config/cf/site.def Sat Aug 29 10:59:18 1998
@@ -132,3 +132,8 @@
#include <host.def>

#endif /* AfterVendorCF */
+
+#define XF68FBDevServer YES
+# define XF68FBDevCFB8 YES
+# define XF68FBDevCFB16 YES
+# define XF68FBDevCFB32 YES
diff -u ./xc/programs/Xserver/PEX5/dipex/swap/check.c.orig ./xc/programs/Xserver/PEX5/dipex/swap/check.c
--- ./xc/programs/Xserver/PEX5/dipex/swap/check.c.orig Wed Apr 27 09:19:06 1994
+++ ./xc/programs/Xserver/PEX5/dipex/swap/check.c Sat Aug 29 16:44:24 1998
@@ -133,7 +133,7 @@
checkStdHeader *strmPtr;
{
/* HACK ALERT ON */
-extern INT16 lastfp[];
+extern INT16 lastfp[MAXCLIENTS];
/* HACK ALERT OFF */

pexEnumTypeIndex fp;
@@ -193,7 +193,7 @@
pexContext *cntxtPtr;
checkStdHeader *strmPtr;
{
-extern INT16 lastfp[];
+extern INT16 lastfp[MAXCLIENTS];

pexEnumTypeIndex fp;

diff -u ./xc/programs/Xserver/cfb/cfbcmap.c.orig ./xc/programs/Xserver/cfb/cfbcmap.c
--- ./xc/programs/Xserver/cfb/cfbcmap.c.orig Sat Aug 29 10:58:46 1998
+++ ./xc/programs/Xserver/cfb/cfbcmap.c Sat Aug 29 16:22:08 1998
@@ -413,6 +413,25 @@
return TRUE;
}

+static int cfbRedBits;
+static int cfbRedOffset;
+static int cfbGreenBits;
+static int cfbGreenOffset;
+static int cfbBlueBits;
+static int cfbBlueOffset;
+
+Bool
+cfbSetColorMasks(rb,ro,gb,go,bb,bo)
+ int rb,ro,gb,go,bb,bo;
+{
+ cfbRedBits = rb;
+ cfbRedOffset = ro;
+ cfbGreenBits = gb;
+ cfbGreenOffset = go;
+ cfbBlueBits = bb;
+ cfbBlueOffset = bo;
+}
+
/*
* Given a list of formats for a screen, create a list
* of visuals and depths for the screen which coorespond to
@@ -524,12 +543,21 @@
visual->ColormapEntries = _CE(d);
/* fall through */
case StaticColor:
- visual->redMask = _RM(d);
- visual->greenMask = _GM(d);
- visual->blueMask = _BM(d);
- visual->offsetRed = _RS(d);
- visual->offsetGreen = _GS(d);
- visual->offsetBlue = _BS(d);
+ if (cfbRedBits && cfbGreenBits && cfbBlueBits) {
+ visual->redMask = ((1 << cfbRedBits) - 1) << cfbRedOffset;
+ visual->greenMask = ((1 << cfbGreenBits) - 1) << cfbGreenOffset;
+ visual->blueMask = ((1 << cfbBlueBits) - 1) << cfbBlueOffset;
+ visual->offsetRed = cfbRedOffset;
+ visual->offsetGreen = cfbGreenOffset;
+ visual->offsetBlue = cfbBlueOffset;
+ } else {
+ visual->redMask = _RM(d);
+ visual->greenMask = _GM(d);
+ visual->blueMask = _BM(d);
+ visual->offsetRed = _RS(d);
+ visual->offsetGreen = _GS(d);
+ visual->offsetBlue = _BS(d);
+ }
}
vid++;
visual++;
diff -u ./xc/programs/Xserver/hw/xfree68/fbdev/fbdev.c.orig ./xc/programs/Xserver/hw/xfree68/fbdev/fbdev.c
--- ./xc/programs/Xserver/hw/xfree68/fbdev/fbdev.c.orig Sat Aug 29 10:58:46 1998
+++ ./xc/programs/Xserver/hw/xfree68/fbdev/fbdev.c Sat Aug 29 16:23:06 1998
@@ -742,7 +742,6 @@
break;

case FB_VISUAL_STATIC_PSEUDOCOLOR:
- case FB_VISUAL_STATIC_DIRECTCOLOR:
if (var->grayscale)
visuals = StaticGrayMask;
else
@@ -805,7 +804,6 @@
break;

case FB_VISUAL_STATIC_PSEUDOCOLOR:
- case FB_VISUAL_STATIC_DIRECTCOLOR:
if (var->grayscale)
visuals = StaticGrayMask;
else
@@ -849,6 +847,14 @@
#ifdef CONFIG_CFB16
case 16:
fbtype = "cfb16";
+ cfbSetColorMasks(initscrvar.red.length,
+ initscrvar.red.offset,
+ initscrvar.green.length,
+ initscrvar.green.offset,
+ initscrvar.blue.length,
+ initscrvar.blue.offset);
+ if (!cfbSetVisualTypes (bpp, TrueColorMask, 6))
+ FatalError("cfbSetVisualTypes: FALSE\n");
cfb16ScreenInit(pScreen, fbdevVirtBase, xsize, ysize,
dxres, dyres, width);
fbdevPrivateIndexP = &cfb16ScreenPrivateIndex;
@@ -860,6 +866,14 @@
#ifdef CONFIG_CFB32
case 32:
fbtype = "cfb32";
+ cfbSetColorMasks(initscrvar.red.length,
+ initscrvar.red.offset,
+ initscrvar.green.length,
+ initscrvar.green.offset,
+ initscrvar.blue.length,
+ initscrvar.blue.offset);
+ if (!cfbSetVisualTypes (bpp, TrueColorMask, 8))
+ FatalError("cfbSetVisualTypes: FALSE\n");
cfb32ScreenInit(pScreen, fbdevVirtBase, xsize, ysize,
dxres, dyres, width);
fbdevPrivateIndexP = &cfb32ScreenPrivateIndex;
diff -u ./xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c.orig ./xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c
--- ./xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c.orig Sat Aug 29 10:58:46 1998
+++ ./xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c Sat Aug 29 10:59:18 1998
@@ -87,7 +87,7 @@
{
struct termios nTty;

- ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW);
+ ioctl(xf86Info.consoleFd, KDSKBMODE, K_MEDIUMRAW);
nTty = kbdtty;
nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
nTty.c_oflag = 0;
diff -u ./xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c.orig ./xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c
--- ./xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c.orig Sat Aug 29 10:58:46 1998
+++ ./xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c Sat Aug 29 10:59:18 1998
@@ -100,7 +100,7 @@
#ifdef USE_DEV_FB
fb_dev_name=getenv("FRAMEBUFFER");
if (!fb_dev_name)
- fb_dev_name="/dev/fb0current";
+ fb_dev_name="/dev/fb0";
if ((fbfd = open(fb_dev_name, O_RDONLY)) < 0)
FatalError("xf86OpenConsole: Cannot open %s (%s)\n",
fb_dev_name, strerror(errno));

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.altern.org/andrebalsa/doc/lkml-faq.html