Debian Linux on Dell Inspiron 600m

disclaimer:

Use at your own risk, I take no responsiblity for people following these notes and having undesireable results. It isn't uncommon for manufacturers to change components on a product line as time goes on and you may have selected different compenents (my lspci -vv output ) than I did so your mileage may vary. Please do give me feedback by email to ted@guilds.net and I will maintain this from future discoveries I or others make so do check back. The Inspiron 600m and the Latitude D600 are largely similar in hardware so you may wish to look at notes for that machine as well, I'd recommend Martin List-Peterson's at http://www.marlow.dk/?target=dell_d600.

support:

I hope this information is useful and saves you considerable effort but please don't expect me to give individual email tech support or be able to explain how to do the following with Mandrake and draketools (I don't know it) for instance. If you've exhausted all avenues and still baffled I might be able to help. You might do better elsewhere though http://groups.yahoo.com/group/linux-dell-laptops/ seems like a good forum for this sort of thing. If there's something that tripped you up and you think it might cause someone else to stumble do post your solution to a public forum and drop me a line if you think it should be included here.

review:

Nice laptop so far. Battery life span is not optimum but I knew that going for a lighter weight laptop, hopefully can improve with acpi lowering cpu speed, fan etc someday after I learn more about that. I was doing things like turning off the monitor when screen was closed and playing with cpu throttling with 2.6 and cpufreqd but haven't eeked out that much more battery lifespan. In fact these batteries are atrophying rapidly and I'm getting less and less time out of them. Dell make better laptop batteries for all models not just select few, this is appalling in this day and age.

Pictures taken of the inside. Dell Tech support walked me through the opening procedure to diagnose a problem over the phone. Fun permission and details instructions on cracking this thing open without voiding a warranty. I will not relay the procedure as I do not want to be responsible for someone breaking their machine, fake a call to them instead.

dell stuff:

I wish laptop manufacturers would make available the chipsets of the various components if they're not (like most don't) document setting up other operating systems prospective customers. Some of my pre-purchase questions on the commponents were answered by my institution's designated sales rep allowing me to do a bit of the legwork before it arrived and influenced my decision to try it for my linux platform.

cpu:

	Intel Pentium M processor at 1.3 GHz
	On-die 1 MB L2 cache
	32 KB Internal L1 Cache
	400 MHz external BUS frequency
	Intel 855PM chipset

Don't be so concerned about that 1.3 number as these M (aka Centrino) processors have pretty good benchmarks. http://www4.tomshardware.com/mobile/20030205/index.html Their performance and reportedly reduced power consumption was a factor in my decision. I didn't go with the more expensive 1.6 GHz processor and think the processing power will be more than adequate for my purposes.

I've seen different opinions on whether this should be optimized as a PIII or P4 in kernel config as it takes some from both processor architectures. There are some custom patches coming out see http://tuxmobil.org/centrino.html for more information.

cat /proc/cpuinfo

memory:

Dell was running a sale at the right time allowing me to max out the memory, up the video, disk, etc while staying in the budget I was given. I'm not sure I'll often need a full Gig of (DDR SDRAM) RAM and will look into playing with the kernel buffers, various caches and such so as to go to disk less often.

pcmcia:

Working

Make sure to remove port 0x800-0x8ff from include in you /etc/pcmcia/config.opts and to have yenta_socket module built, installed and used (set in /etc/default/pcmcia Note debian location /etc/sysconfig/pcmcia with Redhat and some others) instead of i82365.

ethernet:

Working

tg3 which is generally built as a module. It was initially flaky as was my pcmica but cleared since building a custom kernel and using yenta_socket for pcmcia (which should be unrelated).

wireless:

Working but with different hardware
Dell TrueMobileTM 1300 (802.11b/g) mini PCI wireless card

Dell identified choice as being Broadcom based during the presales inquiry and I couldn't get more response from them on the chipsets of the other mini-pci wireless choices. I found some mention of people who have had problems with Broadcom's wireless on linux http://ask.slashdot.org/askslashdot/03/03/02/0221230.shtml?tid=137&tid=106 (and other posts elsewhere) in spite of Broadcom's claim it's supported http://www.broadcom.com/products/94306.html. I emailed Broadcom inquiring about a driver but haven't heard back. In my opinion Broadcom's claim can be viewed as false advertising of linux support when they never released (not even released closed source as some vendors opt for linux kernel modules supporting their hardware) the driver. People are very possibly purchasing their hardware as a direct result of Broadcom's advertised claims of existing support either in wireless cards or part of entire laptop systems containing it. The Dell TM 1400 is also based on Broadcom chipset http://www.dell.com/us/en/hied/learnmore/learnmore_wirelesstrans_notebooks_popup_inspn_gen.htm

If you have the Broadcom chipset consider signing the petition for Broadcom to release their existing driver http://www.petitiononline.com/BCM4301/petition.html. You may also wish to check in http://sourceforge.net/projects/linux-bcom4301/ as they are planning on working on a driver.

A fellow Dell user pointed me to Linuxant's DriverLoader https://www.linuxant.com/drivers_bcmwl/ that can run Windows drivers in Linux. It reportedly works with the Broadcom based Truemobile cards https://www.linuxant.com/drivers_bcmwl/bcmwl5/index.php

There is now a native linux driver for the Intel 2100 http://ipw2100.sourceforge.net/. This Intel card also known to work with some success under Linux using http://ndiswrapper.sourceforge.net/. This is similar approach to Broadcom wrapper solutions and the following Windows driver from Dell's site. Network: Intel (R) Pro/Wireless 2100 LAN miniPCI Adapter, Driver, Windows 2000, Windows XP http://ftp.us.dell.com/network/R64838.EXE

Apparently some of their other Dell True Mobile cards are Lucent based http://www.cs.princeton.edu/~sudhakar/linux/linux-dell.html and work with the renouned Orinoco driver http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Orinoco.html that I've used with a pcmcia wireless card in the past. I spoke with a helpful person in Dell's wireless support group who said that the Lucent based one is the TrueMobile 1150 and although not listed as supported on the 600m it should work. Before the Broadcom Linux/Windows solutions became viable, my Dell sales rep managed to get the Lucent 1150 one for me and low and behold it works. I'll probably stick with the Lucent choice until I have a 802.11g AP at home. One added benefit with a full linux based option is for more flexible driver options for P2P ad-hoc networking and wireless network detection and sniffing http://www.kismetwireless.net/

bluetooth:

Working

If you opted for the bluetooth module it works fine using the appropriate modules in my 2.6 kernel config. With the linux util hciconfig you can take it down so that it isn't transmitting and receiving if you don't want it to. I would guess it would still use consume power (drain battery) even if not transmitting. In the BIOS you can enable/disable it and the 802.11b wireless but you cannot disable the bluetooth alone which is kind of silly to me. I have no use for it so I took it out and will give away to one of the other 600m owners I know.

modem:

Working

Internal 56K4 capable v.92 Fax modem - identified by email in presales communication as Conexant based. A win-modem (software instead of hardware based).

Conexant Modem has some support but don't know specifics. It seems there's great variation depending on how the modems were used so I might have to ask for details on this from your techs.

http://www.mbsi.ca/cnxtlindrv/

Aha apparently it's not Conexant

00:1f.6 Modem: Intel Corp. 82801DB AC'97 Modem (rev 01) (prog-if 00 [Generic])
	Subsystem: PCTel Inc: Unknown device 4c21
	Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-
	Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR-
	Latency: 0
	Interrupt: pin B routed to IRQ 11
	Region 0: I/O ports at b400 [size=256]
	Region 1: I/O ports at b080 [size=128]
	Capabilities: [50] Power Management version 2
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 PME-Enable- DSel=0 DScale=0 PME-

For 2.4 kernels I used pctel driver with the patch in this note http://pctelcompdb.sourceforge.net/viewdetails.php?id_no=144 and it works although I don't hear dialtone but tested connecting to another modem. See modules.conf for ptserial and pctel settings.

For this given modem configure pctel's source with the following argument.

./configure --with-hal=i8xx

For 2.6 kernels pctel nor Intel's semi-open drivers were an option, but there is now snd-intel8x0m module in the kernel tree or linmodem works http://linmodems.technion.ac.il/resources.html. I recommend going with snd-intel8x0m module as it's and for debian users simply apt-get install sl-modem-daemon choose right country settings. wvdialconf detects the modem at /dev/ttySL0 and gives decent init strings and away you go.

kernel modules:

lsmod listing (for 2.4 kernel), including the probed USB ones (usb works) modules and modules.conf. You are also welcome to my 2.4.23 kernel config or a built and packaged (known to work on debian sarge, use at your own risk). One no longer need patches and DSDT for complete ACPI support.

2.6.3 kernel /etc/modules /etc/modules.conf the .config of compile and packaged (**works on sarge with module-init-tools package installed, use at your own risk) up including kismet for orinoco_cs and lirc patches.

x notes:

Working

XF86Config-4 and XFree86.0.log files probably of some use.

Hardware acceleration possible in one of several manners, take your choice. X4.2 with ATi's closed source drivers (some notes below) or X4.3 with XFree's drivers and recent 2.4 or 2.6 kernel. My advice is to go with X4.3 and their drivers with a properly configured kernel as some have reported issues (freeze-ups) and lower fps.

Graphics Cards 64 MB DDR ATi Mobility RADEON 9000 4X AGP. Seen by radeon kernel modules and X as Radeon Mobility 9000 M9

Synaptics Mouse possible with the touchpad under X with a kernel patch, see http://people.w3.org/~dom/archives/2005/01/laptop-touchpad-advanced-features/. My X config with synaptic settings

Manufacturer's page on it. http://mirror.ati.com/technology/hardware/mobilityradeon9000/index.html ATi has a closed source driver that another 600m owner has got working with X 4.2 yet (comparing notes, logs, /usr/X11R6 contents, etc). I am going to leave both X4.2 and 4.3 installed and may try ATi driver again or hope for XFree86 one to improve.

ATi general linux stuff http://www.ati.com/support/faq/linux.html. Driver install doc http://pdownload.mii.instacontent.net/ati/drivers/410251-420251.html. You may get ATi's driver by going through their menus and accepting their license starting off at http://mirror.ati.com/support/driver.html

sweet 1400x1050, not bad for a lightweight laptop IMHO
bash-2.05b$ glxinfo 
name of display: :0.0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.2
server glx extensions:
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_context
client glx vendor string: SGI
client glx version string: 1.2
client glx extensions:
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_context, 
     GLX_NV_vertex_array_range, GLX_MESA_agp_offset
GLX extensions:
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_context
OpenGL vendor string: Tungsten Graphics, Inc.
OpenGL renderer string: Mesa DRI R200 20020827 AGP 1x x86/MMX TCL
OpenGL version string: 1.2 Mesa 4.0.4
OpenGL extensions:
    GL_ARB_imaging, GL_ARB_multitexture, GL_ARB_texture_env_add, 
    GL_ARB_texture_env_combine, GL_ARB_texture_env_dot3, 
    GL_ARB_transpose_matrix, GL_EXT_abgr, GL_EXT_bgra, GL_EXT_blend_color, 
    GL_EXT_blend_logic_op, GL_EXT_blend_minmax, GL_EXT_blend_subtract, 
    GL_EXT_clip_volume_hint, GL_EXT_convolution, GL_EXT_compiled_vertex_array, 
    GL_EXT_histogram, GL_EXT_packed_pixels, GL_EXT_polygon_offset, 
    GL_EXT_rescale_normal, GL_EXT_secondary_color, GL_EXT_stencil_wrap, 
    GL_EXT_texture3D, GL_EXT_texture_env_add, GL_EXT_texture_env_combine, 
    GL_EXT_texture_env_dot3, GL_EXT_texture_filter_anisotropic, 
    GL_EXT_texture_object, GL_EXT_texture_lod_bias, GL_EXT_vertex_array, 
    GL_IBM_rasterpos_clip, GL_MESA_pack_invert, GL_MESA_ycbcr_texture, 
    GL_MESA_window_pos, GL_NV_texgen_reflection, GL_NV_texture_rectangle, 
    GL_SGI_color_matrix, GL_SGI_color_table
glu version: 1.3
glu extensions:
    GLU_EXT_nurbs_tessellator, GLU_EXT_object_space_tess
[...]

According to docs at xfree86.org DRI is possible with their radeon driver. http://www.xfree86.org/4.3.0/DRI3.html

sound:

Working
intel ICH4 845G/GL chipset AC'97

OSS i810 driver i810_audio, works well so far. Also reported (by another 600m owner) to work with ALSA drivers (email excerpt below). I switched personally from OSS to ALSA with 2.6 kernel and chose some OSS compatibility options in kernel config. Starting with 2.6.6 it seems like you need "options snd-intel8x0 ac97_quirk=3" in /etc/modules.conf whereas default for this option -1 was fine earlier see Documentation/sound/alsa/ALSA-Configuration.txt in kernel source tree for more info.

For alsa I wanted to have apt handle as much as possible, so I did 
apt-get install alsa-utils, which installed everything except the 
driver package; I downloaded and compiled that myself (configure
line was ./configure --with-cards=intel8x0 --with-oss=yes 
--with-sequencer=yes --with-kernel=/usr/src/linux-2.4.20 .  After 
that a make install was enough! in /etc/modules all I put was
snd-intel8x0 and snd-pcm-oss.  Alsa automatically saves and restores
mixer settings on boot and shutdown, so you don't need the aumix
boot scripts (if you have them).

That damn bell. Who wants their laptop beeping at them every time they tab complete? aumix -p has no affect on quieting this nor does overall volume. If this bothers you like it did me read http://www.tldp.org/HOWTO/mini/Visual-Bell.html in particular silencing applications http://www.tldp.org/HOWTO/mini/Visual-Bell-8.html to shut up most X applications, bash/console, emacs etc. CARDMGR_OPTS="-qvf" in /etc/default/pcmcia keeps your laptop from beeping on pcmcia card insertion. I hear of a kernel patch to be able to silence the bell, here's hoping it makes it into the tree so we can silence this in one place in kernel config.

cdrw/dvd:

Working
Combo Drive: 24x/10x/24x CD-RW and 8x DVD

CD Writing works using ide-scsi module (in 2.4 kernels, deprecated in 2.6 kernels) append="hdc=ide-scsi" in the appropriate stanza in /etc/lilo.conf and [re]linking cdrom and dvd under /dev. For more on cd writing see http://www.tldp.org/HOWTO/CD-Writing-HOWTO.html and elsewhere for ide based cdrw drives and cd writing.

rm cdrom
ln -s sr0 cdrom
ln -s sr0 dvd

If you're using the 2.6 kernel you'll want to use ide-cd and leave the devices /dev/cdrom and /dev/dvd pointing to /dev/hdc (or whatever dmesg tells you it is).

DVDs play well with xine, vlc and ogle even at full screen at this resolution as the AGP throughput and video memory are sufficient and DRI (see X notes) is likely not involved.

disk:

Working
	40 GB Ultra ATA hard drive
	5400rpm

twas faster than the 30 or 60 ;-) and the 60 wasn't worth the money. Hitachi has a pdf on the specs http://www.hitachi.com/Apps/hitachicom/supportingdocs/itbusinessproducts/storage/25dd/DK23EA_DK23EBSeriesDS.pdf of this drive and the similiar models that were the other options.

Some tuning with hdparam might be in order. Alternatively you can go through the kernel config making all the appropriate choices. If you want to know why just look at the before and after and see the difference in throughput.

pero:/usr/src# hdparm -tT /dev/hda

/dev/hda:
 Timing buffer-cache reads:   128 MB in  0.25 seconds =512.00 MB/sec
 Timing buffered disk reads:  64 MB in 23.13 seconds =  2.77 MB/sec

pero:/usr/src# hdparm -i /dev/hda

/dev/hda:

 Model=HITACHI_DK23EB-40, FwRev=00K0A0C0, SerialNo=AX8058
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160
 IORDY=yes, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 
 AdvancedPM=yes: mode=0x80 (128) WriteCache=enabled
 Drive conforms to: ATA/ATAPI-5 T13 1321D revision 3:  2 3 4 5
Just because I haven't had any issues (yet or realized) with this is no certainly this will be painless for you as well, use at your own risk rtfmanpage (with all the warnings therein) and don't come crying to me if you disk gets toasted. Any hdparm type setting should go into an init script. I often make a /etc/init.d/rc.local to perform a number of additional items I was done at boot not done by the other init scripts and symlink it in to the appropriate runlevel pero:/etc/rc2.d# ln -s ../init.d/rc.local S99rc.local
pero:/usr/src# hdparm -X udma5 -d1 -u1 -m32 -S 240 -c3 /dev/hda


/dev/hda:
 setting 32-bit IO_support flag to 3
 setting multcount to 32
 HDIO_SET_MULTCOUNT failed: Invalid argument
 setting unmaskirq to 1 (on)
 setting using_dma to 1 (on)
 setting xfermode to 69 (UltraDMA mode5)
 setting standby to 240 (20 minutes)
 multcount    = 16 (on)
 IO_support   =  3 (32-bit w/sync)
 unmaskirq    =  1 (on)
 using_dma    =  1 (on)

pero:/usr/src# hdparm -i /dev/hda

/dev/hda:

 Model=HITACHI_DK23EB-40, FwRev=00K0A0C0, SerialNo=AX8058
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160
 IORDY=yes, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 
 AdvancedPM=yes: mode=0x80 (128) WriteCache=enabled
 Drive conforms to: ATA/ATAPI-5 T13 1321D revision 3:  2 3 4 5

pero:/usr/src# hdparm -tT /dev/hda

 /dev/hda:
 Timing buffer-cache reads:   128 MB in  0.25 seconds =512.00 MB/sec
 Timing buffered disk reads:  64 MB in  2.23 seconds = 28.70 MB/sec

ah 10 times better and there's probably more tuning that can be done here but that's good for now.

serial:

Working

/dev/ttys0 and works with minicom and various other serial based applications.

bash-2.05b$ setserial -av /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
	Baud_base: 115200, close_delay: 50, divisor: 0
	closing_wait: 3000
	Flags: spd_normal skip_test

usb:

Working

Handled by ehci-hcd and usb-uhci modules

infrared:

Working

I've had success with both the irport and lirc_sir (for LIRC http://www.lirc.org using io=0x02e8 irq=3 after enabling infrared in the BIOS. I hope that someday GPS/GPSR phones have better coverage near me so I can do dialup through one via infrared as I've seen others.

tv out:

Working

Email excerpt from user report. I've no inclination yet and no such cable laying around to try it out with.

I got TV-Out to work with X and found a solution to the whiting out of the 
screen(and the initial cause).

First how to have working TV-out and X.  Have your TV cable attached to your 
TV and your TV one before booting the laptop.  Next start X with the VESA 
driver (unless you don't need the mouse) and have the res 640x480 (or 800x600 
if your TV supports it).  With the vesa driver the screen does not white out 
when you first touch the touch pad, have not checked to see what happens with 
an external mouse yet.  When the resolution is set at your TV's res run (as 
root) atitvout -f t.  Change back with atitvout -f l.

With the ATI driver (from xfree) don't use the mouse! it causes the screen 
whiting out.  Otherwise steps are the same.

TV out does work with higher res (seems that 1280x1024 is the max supported 
out though) and in 24 bit color mode.

Also tested was an external monitor.  fn-f8 is a hardware or ACPI key that 
works and will cylce between LCD, LCD and CRT, CRT.

Mike

power management:

Working

You'll need the acpid daemon acpid package and a bunch of the acpi modules for the different components (see lsmod and kernel config). One doesn't need a custom DSDT anymore for acpi so removing that information. For swsusp you only need to patch your kernel if you use radeonfb module, otherwise a recent 2.6 kernel works fine. I haven't taken the time to document my acpi and suspend setup completely and instead refer you to http://www.loria.fr/~thome/d600/#scripts which will work, you will certainly want the radeontool to black out your screen on lid close.

bash-2.05b$ cat /proc/acpi/battery/BAT0/info 
present:                 yes
design capacity:         48000 mWh
last full capacity:      48000 mWh
battery technology:      rechargeable
design voltage:          11100 mV
design capacity warning: 3000 mWh
design capacity low:     1000 mWh
capacity granularity 1:  200 mWh
capacity granularity 2:  200 mWh
model number:            DELL 0008P7
serial number:           104
battery type:            LION
OEM info:                Sanyo

Those fn keys:

Working

Anyone running Linux on Dell laptop should look into i8k apparently. Well the i8k module is working and the cpu monitoring but I haven't finished figuring out the fn keys apt-got the packages.

http://www.debian.org/~dz/i8k

In spite of i8k module loading and getting details from /proc/i8k I don't get any state change from pressing any buttons and running i8kbuttons from the prompt in verbose mode.

bash-2.05b$ cat /proc/i8k 

1.0 A08 FOOBAR 43 -22 1 27660 75270 -1 0
|   |   |       |  |  |    |    |    | |
|   |   |       |  |  |    |    |    | +------- 10. buttons status
|   |   |       |  |  |    |    |    +---------  9. ac status
|   |   |       |  |  |    |    +--------------  8. right fan rpm
|   |   |       |  |  |    +-------------------  7. left fan rpm
|   |   |       |  |  +------------------------  6. right fan status
|   |   |       |  +---------------------------  5. left fan status
|   |   |       +------------------------------  4. CPU temperature (Celsius)
|   |   +--------------------------------------  3. serial number
|   +------------------------------------------  2. BIOS version
+----------------------------------------------  1. /proc/i8k format version

Well there's still hope for getting data out of i8k if I can't get it to control the buttons or change the cpu fan speed, hopefully acpi for the later before long. I suspect this is a borken BIOS kind of thing from Dell as I see they haven't been very forthcoming on information about their BIOS to i8kutils author. Bad OEM.

Now that I have a working wireless mini-pci card it seems like the fn-f2 button indeed cuts the power to that card even if the auxillary cable isn't connected so presumably it shuts down the mini-pci portion of the pcmcia bus.

For other fn keys like volume up and down and the mute button I installed hotkeys (apt-get install if you're debian) wrote a quick ~/.hotkeys/600m.def keyboard def file using keycode data from xev util that utilizes aumix and a little mute/unmute script I wrote. CD eject, someday (later in acpi) battery status, that Windows key if you want to bind it to something and that menu like key next to PrntScrn which now can do screen snapshots with util of your choice, and so forth. Save the 600m.def to your ~/.hotkeys directory, edit to taste and have your window manager run "hotkeys -t 600m" when it starts. Some window manager like gnome and kde have their own keybinding capabilites and there are certainly other solutions like xmodmap if this isn't to your liking.


Ted Guild
$Id: index.html,v 1.14 2005/12/05 21:37:14 ted Exp $

Valid XHTML 1.0!