The PhoneBoy Blog


Simplifying Telecom, Mobile Phones, Gadgets, and More!

A PhoneBoy Primer On: Linux, X Windows, and NeoMagic Chipsets

Note: Since this article was written, Red Hat Software has released XBF binaries for XFree86 that will run on specific laptops with specific NeoMagic chips. See RedHat's Press Release and Hardware Compatibility List for more information.

A while back, I was trying to install Linux on my work-supplied laptop: a Dell Lattitude CP. Red Hat Linux 5.0 installed on their pretty easily and most everything worked "out of the box" except for one thing: X Windows. X Windows for a Unix station is similiar to how Windows 3.11 is to Dos 6.22: It provides (the ability for) a graphical user interface. X Windows is a standard that has existed in the Unix community for many years and almost all graphical applications on a Unix workstation are X-based.

At the time, I did a lot of research into how I could make X Windows work on my laptop. I did many searches on Usenet and the web and found that nobody had found a way to do this. What I did find in these searches annoyed me and many other Linux laptop users. NeoMagic, a company that makes display hardware for a variety of laptops, will not freely give out the information necessary to write a suitable X Windows server that will run on Neomagic chips. NeoMagic will not give out this information unless you pay them money and are willing to sign a non-disclosure agreement (NDA). Since Linux is based on free or GNU-licensed software and XFree86 (the X server used on most Linux systems) includes the source code, NeoMagic would not be willing to give this information to the developers. Period.

It turned out that my laptop had the dreaded NeoMagic chips in it and that my only realistic options for running X windows on my work laptop was to:

  • Spend $200 on XiGraphics' X server that supports NeoMagic chips
  • Run a 16-color X server

Since neither of those options appealed to me at the time, I decided against installing Linux and decided to order Solaris x86 2.6.

Meanwhile, I recently needed a packet sniffer that I could take with me. Remembering my previous success with installing Linux sans an X server, I decided to do it anyway. I did some more research and hoped I might find something, anything, that would let me run X reasonably on my laptop. In searching, I came across the "Linux on Laptops" page, which aside from having lots of neat information about running Linux on a laptop, provided me a link to Jeff Shorey's page where he has an X server that would work on NeoMagic chips (or at least it worked for him). I gave it a shot, figuring "what the hell." Lo and behold, I was able to get it to work in 1024x768 in 256 colors (8bpp) mode. It took a bit of tweaking since the information that Jeff provided was geared towards 800x600, but hey, it was definately an improvment.

So far, in the time that I've played with it, I've found the X server to be reasonably stable, albeit not terribly speedy. Most vendor-specific X servers are hardware-accelerated, e.g. they can take advantage of the video hardware. Since little is known about the NeoMagic chips, the "unaccelerated" SVGA X server has to be used, though it was tweaked a bit to work on the NeoMagic chips.

In any case, I thank Jeff Shorey (and anyone else involved) for making this server available so that those of us with NeoMagic chips can at least use X Windows now without having to shell out lots of money.

Specific Details of my Setup

YMMV, of course, but hey.

My Laptop is a Dell Lattitude CP that has the 128XD chips (or NM2160). My laptop will support 1024x768x16bpp in Windows, though I have only been able to get this to work in 1824x768x8bpp. This may work on other laptops, but since I only have mine, I can't tell you for sure. But here are some hints that may help:

Look at the Modelines in the XF86Config file:

Modeline "1024x768"    85    1024 1032 1152 1360   768  784  787  823 +hsync +vsync

The third entry (re the 85) is dot clock that is used for that mode. There are several dot clocks for 1024x768. If this one does not work for you, try a different one:

  1. Comment out the current 1024x768 setting that is uncommented (below, I use 85).
  2. Find a different 1024x768 line with a different dot clock (e.g. the one for 65).
  3. Remove the previous "Dot Clock" from your "Clocks" line in your Device section and replace it with the new dot clock setting (e.g. replace 85 with 65).
  4. Save your XF86Config file, restart X, cross your fingers. ;-)

If you find a specific dot clock (or Modeline for that matter) that works for you, let me know.

Here's my XF86Config file:

# File generated by xf86config.

#
# Copyright (c) 1995 by The XFree86 Project, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
# OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Except as contained in this notice, the name of the XFree86 Project shall
# not be used in advertising or otherwise to promote the sale, use or other
# dealings in this Software without prior written authorization from the
# XFree86 Project.
#

#
# Refer to the XF86Config(4/5) man page for details about the format of
# this file.
#

#
# Files section.  This allows default font and rgb paths to be set
#

Section "Files"

# The location of the RGB database.  Note, this is the name of the
# file minus the extension (like ".txt" or ".db").  There is normally
# no need to change the default.

    RgbPath     "/usr/X11R6/lib/X11/rgb"

# Multiple FontPath entries are allowed (which are concatenated together),
# as well as specifying multiple comma-separated entries in one FontPath
# command (or a combination of both methods)
#
# If you don't have a floating point coprocessor and emacs, Mosaic or other
# programs take long to start up, try moving the Type1 and Speedo directory
# to the end of this list (or comment them out).
#

    FontPath   "/usr/X11R6/lib/X11/fonts/misc/"
    FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
    FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
    FontPath   "/usr/X11R6/lib/X11/fonts/Type1/"
    FontPath   "/usr/X11R6/lib/X11/fonts/Speedo/"
    FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/"
    FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/"

# For OSs that support Dynamically loaded modules, ModulePath can be
# used to set a search path for the modules.  This is currently supported
# for Linux ELF, FreeBSD 2.x and NetBSD 1.x.  The default path is shown
# here.

#    ModulePath "/usr/X11R6/lib/modules"

EndSection

#
# Module section -- this is an optional section which is used to specify
# which dynamically loadable modules to load.  Dynamically loadable
# modules are currently supported only for Linux ELF, FreeBSD 2.x
# and NetBSD 1.x.  Currently, dynamically loadable modules are used
# only for some extended input (XInput) device drivers.
#

#
# Section "Module"
#
# This loads the module for the Joystick driver
#
# Load "xf86Jstk.so"
#
# EndSection

#
# Server flags section.
#

Section "ServerFlags"

# Uncomment this to cause a core dump at the spot where a signal is
# received.  This may leave the console in an unusable state, but may
# provide a better stack trace in the core dump to aid in debugging

#    NoTrapSignals

# Uncomment this to disable the <Crtl><Alt><BS> server abort sequence
# This allows clients to receive this key event.

#    DontZap

# Uncomment this to disable the <Crtl><Alt><KP+>/<KP-> mode switching
# sequences.  This allows clients to receive these key events.

#    DontZoom

# Uncomment this to disable tuning with the xvidtune client. With
# it the client can still run and fetch card and monitor attributes,
# but it will not be allowed to change them. If it tries it will
# receive a protocol error.

#       DisableVidModeExtension

# Uncomment this to enable the use of a non-local xvidtune client.

#       AllowNonLocalXvidtune

# Uncomment this to disable dynamically modifying the input device
# (mouse and keyboard) settings.

#       DisableModInDev

# Uncomment this to enable the use of a non-local client to
# change the keyboard or mouse settings (currently only xset).

#       AllowNonLocalModInDev

EndSection

#
# Input devices
#

#
# Keyboard section
#

Section "Keyboard"

    Protocol    "Standard"

# when using XQUEUE, comment out the above line, and uncomment the
# following line

#    Protocol   "Xqueue"

    AutoRepeat  500 5
# Let the server do the NumLock processing.  This should only be required
# when using pre-R6 clients
#    ServerNumLock

# Specify which keyboard LEDs can be user-controlled (eg, with xset(1))
#    Xleds      1 2 3

# To set the LeftAlt to Meta, RightAlt key to ModeShift,
# RightCtl key to Compose, and ScrollLock key to ModeLock:

#    LeftAlt     Meta
#    RightAlt    ModeShift
#    RightCtl    Compose
#    ScrollLock  ModeLock

# To disable the XKEYBOARD extension, uncomment XkbDisable.

#    XkbDisable

# To customise the XKB settings to suit your keyboard, modify the
# lines below (which are the defaults).  For example, for a non-U.S.
# keyboard, you will probably want to use:
#    XkbModel    "pc102"
# If you have a US Microsoft Natural keyboard, you can use:
#    XkbModel    "microsoft"
#
# Then to change the language, change the Layout setting.
# For example, a german layout can be obtained with:
#    XkbLayout   "de"
# or:
#    XkbLayout   "de"
#    XkbVariant  "nodeadkeys"
#
# If you'd like to switch the positions of your capslock and
# control keys, use:
#    XkbOptions  "ctrl:swapcaps"

# These are the default XKB settings for XFree86
#    XkbRules    "xfree86"
#    XkbModel    "pc101"
#    XkbLayout   "us"
#    XkbVariant  ""
#    XkbOptions  ""

    XkbKeymap   "xfree86(us)"
 

EndSection
 

#
# Pointer section
#

Section "Pointer"
    Protocol    "PS/2"
    Device      "/dev/mouse"

# When using XQUEUE, comment out the above two lines, and uncomment
# the following line.

#    Protocol   "Xqueue"

# Baudrate and SampleRate are only for some Logitech mice

#    BaudRate   9600
#    SampleRate 150

# Emulate3Buttons is an option for 2-button Microsoft mice
# Emulate3Timeout is the timeout in milliseconds (default is 50ms)

    Emulate3Buttons
    Emulate3Timeout    50

# ChordMiddle is an option for some 3-button Logitech mice

#    ChordMiddle

EndSection
 

#
# Xinput section -- this is optional and is required only if you
# are using extended input devices.  This is for example only.  Refer
# to the XF86Config man page for a description of the options.
#

#
# Section "Xinput"
#    SubSection "WacomStylus"
#        Port "/dev/ttyS1"
#        DeviceName "Wacom"
#    EndSubSection
#    SubSection "WacomCursor"
#        Port "/dev/ttyS1"
#    EndSubSection
#    SubSection "WacomEraser"
#        Port "/dev/ttyS1"
#    EndSubSection
#
#    SubSection "Elographics"
#        Port "/dev/ttyS1"
#        DeviceName "Elo"
#        MinimumXPosition 300
#        MaximumXPosition 3500
#        MinimumYPosition 300
#        MaximumYPosition 3500
#        Screen 0
#        UntouchDelay 10
#        ReportDelay 10
#    EndSubSection
#
#    SubSection "Joystick"
#        Port "/dev/joy0"
#        DeviceName "Joystick"
#        TimeOut 10
#        MinimumXPosition 100
#        MaximumXPosition 1300
#        MinimumYPosition 100
#        MaximumYPosition 1100
#        # CenterX 700
#        # CenterY 600
#        Delta 20
#    EndSubSection
#
# The Mouse Subsection contains the same type of entries as the
# standard Pointer Section (see above), with the addition of the
# DeviceName entry.
#
#    SubSection "Mouse"
#        Port "/dev/mouse2"
#        DeviceName "Second Mouse"
#        Protocol "Logitech"
#    EndSubSection
# EndSection

#
# Monitor section
#

# Any number of monitor sections may be present

Section "Monitor"

    Identifier  "LCD"
    VendorName  "Unknown"
    ModelName   "Unknown"

# HorizSync is in kHz unless units are specified.
# HorizSync may be a comma separated list of discrete values, or a
# comma separated list of ranges of values.
# NOTE: THE VALUES HERE ARE EXAMPLES ONLY.  REFER TO YOUR MONITOR'S
# USER MANUAL FOR THE CORRECT NUMBERS.

#       HorizSync   31.5 - 48.5
    HorizSync   30-64

#    HorizSync  30-64        

multisync


#    HorizSync  31.5, 35.2   

multiple fixed sync frequencies


#    HorizSync  15-25, 30-50  # multiple ranges of sync frequencies

# VertRefresh is in Hz unless units are specified.
# VertRefresh may be a comma separated list of discrete values, or a
# comma separated list of ranges of values.
# NOTE: THE VALUES HERE ARE EXAMPLES ONLY.  REFER TO YOUR MONITOR'S
# USER MANUAL FOR THE CORRECT NUMBERS.

    VertRefresh 50-100

# Modes can be specified in two formats.  A compact one-line format, or
# a multi-line format.

# These two are equivalent

#    ModeLine "1024x768i" 45 1024 1048 1208 1264 768 776 784 817 Interlace

#    Mode "1024x768i"
#        DotClock       45
#        HTimings       1024 1048 1208 1264
#        VTimings       768 776 784 817
#        Flags          "Interlace"
#    EndMode

# This is a set of standard mode timings. Modes that are out of monitor spec
# are automatically deleted by the server (provided the HorizSync and
# VertRefresh lines are correct), so there's no immediate need to
# delete mode timings (unless particular mode timings don't work on your
# monitor). With these modes, the best standard mode that your monitor
# and video card can support for a given resolution is automatically
# used.

# 640x400 @ 70 Hz, 31.5 kHz hsync
Modeline "640x400"     25.175 640  664  760  800   400  409  411  450
# 640x480 @ 60 Hz, 31.5 kHz hsync
Modeline "640x480"     25.175 640  664  760  800   480  491  493  525
# 800x600 @ 56 Hz, 35.15 kHz hsync
ModeLine "800x600"     36     800  824  896 1024   600  601  603  625
# 1024x768 @ 87 Hz interlaced, 35.5 kHz hsync
#Modeline "1024x768"    44.9  1024 1048 1208 1264   768  776  784  817 Interlace

# 640x480 @ 72 Hz, 36.5 kHz hsync
Modeline "640x480"     31.5   640  680  720  864   480  488  491  521
# 800x600 @ 60 Hz, 37.8 kHz hsync
#Modeline "800x600"     40     800  840  968 1056   600  601  605  628 +hsync +vsync
Modeline "800x600"     40     800  856 1040 1056   600  600  626  628 +hsync +vsync

# 800x600 @ 72 Hz, 48.0 kHz hsync
#Modeline "800x600"     50     800  856  976 1040   600  637  643  666 +hsync +vsync
# 1024x768 @ 60 Hz, 48.4 kHz hsync
#Modeline "1024x768"    65    1024 1032 1176 1344   768  771  777  806 +hsync +vsync

# 1024x768 @ 70 Hz, 56.5 kHz hsync
#Modeline "1024x768"    75    1024 1048 1184 1328   768  771  777  806 +hsync +vsync
# 1280x1024 @ 87 Hz interlaced, 51 kHz hsync
#Modeline "1280x1024"   80    1280 1296 1512 1568  1024 1025 1037 1165 Interlace

# 1024x768 @ 76 Hz, 62.5 kHz hsync
Modeline "1024x768"    85    1024 1032 1152 1360   768  784  787  823 +hsync +vsync
# 1280x1024 @ 61 Hz, 64.2 kHz hsync
#Modeline "1280x1024"  110    1280 1328 1512 1712  1024 1025 1028 1054

# 1280x1024 @ 74 Hz, 78.85 kHz hsync
#Modeline "1280x1024"  135    1280 1312 1456 1712  1024 1027 1030 1064

# 1280x1024 @ 76 Hz, 81.13 kHz hsync
#Modeline "1280x1024"  135    1280 1312 1416 1664  1024 1027 1030 1064

# Low-res Doublescan modes
# If your chipset does not support doublescan, you get a 'squashed'
# resolution like 320x400.

# 320x200 @ 70 Hz, 31.5 kHz hsync, 8:5 aspect ratio
Modeline "320x200"     12.588 320  336  384  400   200  204  205  225 Doublescan
# 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio
Modeline "320x240"     12.588 320  336  384  400   240  245  246  262 Doublescan
# 320x240 @ 72 Hz, 36.5 kHz hsync
Modeline "320x240"     15.750 320  336  384  400   240  244  246  262 Doublescan
# 400x300 @ 56 Hz, 35.2 kHz hsync, 4:3 aspect ratio
ModeLine "400x300"     18     400  416  448  512   300  301  602  312 Doublescan
# 400x300 @ 60 Hz, 37.8 kHz hsync
Modeline "400x300"     20     400  416  480  528   300  301  303  314 Doublescan
# 400x300 @ 72 Hz, 48.0 kHz hsync
Modeline "400x300"     25     400  424  488  520   300  319  322  333 Doublescan
# 480x300 @ 56 Hz, 35.2 kHz hsync, 8:5 aspect ratio
ModeLine "480x300"     21.656 480  496  536  616   300  301  302  312 Doublescan
# 480x300 @ 60 Hz, 37.8 kHz hsync
Modeline "480x300"     23.890 480  496  576  632   300  301  303  314 Doublescan
# 480x300 @ 63 Hz, 39.6 kHz hsync
Modeline "480x300"     25     480  496  576  632   300  301  303  314 Doublescan
# 480x300 @ 72 Hz, 48.0 kHz hsync
Modeline "480x300"     29.952 480  504  584  624   300  319  322  333 Doublescan

EndSection
 

#
# Graphics device section
#

# Any number of graphics device sections may be present

# Standard VGA Device:

Section "Device"
    Identifier  "NeoMagic"
    Chipset     "neomagic"

    VideoRam    2048

    Clocks      25.2 28.3 40.0 85.0

EndSection

#
# Screen sections
#

# The Colour SVGA server

Section "Screen"
    Driver      "svga"
    Device      "NeoMagic"
    Monitor     "LCD"
    Subsection "Display"
        Depth       16
        Modes       "1024x768" "800x600"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       8
        Modes       "1024x768" "800x600" "640x480"
        ViewPort    0 0
#       Virtual     1024 855
    EndSubsection
EndSection


To leave a comment on this post, you need a free app.net account or a Facebook account.

Parent, Writer, Podcaster, Coffee Achiever, VoIP/Telco Curious, C-List Information Security Celebrity, and Mobile Phone Connoisseur residing in Gig Harbor WA US. Sometimes NSFW, always a 49ers fan.