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:
- Comment out the current 1024x768 setting that is uncommented (below, I use 85).
- Find a different 1024x768 line with a different dot clock (e.g. the one for 65).
- 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).
- 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