UPDATE UPDATE UPDATE: for anyone coming to this post via Google, one, what's written in it is mostly impossible with modern distributions, since you can't use the old i810 driver any more with recent X.org releases. Two, there'll soon be a much better option - DisplayLink drivers for Linux. See here.
I decided today that I really hadn't had enough crazy hardware hackery in my life lately.
I've been planning for a while to buy a new desktop, replacing the laptop I've been using as my only client system for the last year and a half. This was mainly due to a few irritants with the laptop:
one, it overheated all the time
two, the CD/DVD writer doesn't work
three, I can't have two external monitors on it as it only has one VGA port
four, intel driver bug causing periodic screen blankings that only a reboot can fix
In the end, though, I've decided to try and address these problems with the existing system, which is really a fine system if I can just deal with these things.
So first I tackled the screen blanking bug, which has been driving me nuts. Turns out to be related to a new feature of the X.org intel driver since 2.2.0, called framebuffer compression. Disabling framebuffer compression fixes that problem. This is being addressed by the intel driver developers currently, so hopefully 2.2.1 (or 2.3.0, whatever they call it) and later releases will work fine.
Today, I tackled the overheating and external monitor problems.
Overheating turned out to be easy, once I stopped being pissed off by it and started looking for a solution. One, I did a couple of good hard blows in through the vent where the heatsink is located. That knocked an easy 10 degrees C off of my temperatures. Two, I bought one of those janky 'laptop coolers' - basically a chunk of plastic with a couple of fans in it that you sit your laptop on top of. The fans are powered by USB. Okay, it's janky, but it works; my temperatures are 20 degrees down from where they were, and I can now actually compile things without the system hitting 100C and shutting itself down.
Having two external monitors on a laptop with only one VGA connector is, heh, somewhat more fun.
The most obvious thing to look for is an ExpressCard graphics adapter.
ExpressCard is the successor to PCMCIA / PC Card, for those who don't follow the laptop hardware scene very closely. It's basically a 1x PCI Express socket in a different form factor.
Inexplicably - given the amount of laptops with only one external display connector and no upgrade path - there does not seem to be such a beast.
Back at the start of 2006, Asus announced something called the 'Asus XG Station', which is basically an ExpressCard to PCI Express adapter specifically designed to house a PCI Express graphics card. The idea is to sell it with a mid-range card for $300 or so, but it's really just a generic adapter, the card could be swapped out (with due consideration given to power and cooling issues). However, it's still not on the market. And anyway, the price doesn't really ring my bell; I'd prefer to pay $100 for the adapter and buy a cheap card. I don't need any 3D capabilities.
Aside from this, there's nothing except a workstation-class thing I found (can't find it again) which looks like exactly what I want, with the minor drawback that it costs $800. Which is about how much I was going to spend on the entire new desktop system.
The second most obvious thing to look for is a mini-PCI graphics card.
Again somewhat inexplicably (though slightly less, given the trouble you'd have with connectors given that mini-PCI is conceived as an internal form factor), none of these seem to exist either. MSI apparently made (or, at least, listed) one - possibly only usable with a specific set of MSI motherboards - with an ATI Rage chipset, back in 2002. Since then, nada.
The next thing I came across was something Matrox make, called the DualHead2Go. This, in some way, converts a single VGA output into two (there's a TripleHead2Go as well). I imagine it relies on the underlying hardware actually supporting multiple outputs, and just tricks it into forcing them all through one physical port, or something. I don't know if there's any Linux support for it, because I quickly lost interest when I found in the specs that it doesn't go past 1280x1024 resolution per monitor. I had my heart set on dual 20" 1680x1050 monitors.
So the final, least obvious but actually (more or less) working solution is...
a USB video card.
Yes, you can stop laughing now. These do in fact exist and - miraculously - actually work. More or less.
The one I got is branded a Tritton See2, but I think there's really only basically two types in existence. This one looks like this and pops up under many names and several color schemes, but always looking basically the same (a slightly curved, rounded chunk of plastic around the size of a mouse, with a USB plug on one end and a VGA port on the other). Here's another example. From what I can gather, it basically contains a cheap USB->PCI bridge and an equally cheap SiS graphics chipset. Mine has the USB ID 0711:0900, and identifies via lsusb as a "Magic Control Technology Corp. SVGA Adapter".
The alternative is this. This is built on a system called DisplayLink. It seems to be a rather more sophisticated setup which actually uses customized hardware and has custom drivers which use a lot of compression tricks to substantially increase performance. The drawback is that there is, as far as I can tell, no Linux support at all for this hardware. I have contacted DisplayLink and also the X.org mailing list to see if they know anything at all about each other, we'll see where that goes.
So, as the DisplayLink option seemed to be a non-starter, I decided to go with the more janky alternative, and picked up the Tritton See2 thing (which, rather amazingly, my local retailer - NCIX.com, AKA Netlink - had on hand at their local branch).
To my considerable surprise, it actually works more or less as advertised with a minimum of faffing about. It uses a kernel module (sisusbvga) and an X.org driver (sisusb). With an appropriate xorg.conf, it just works like any more conventional graphics card.
The fun came in trying to get it working along with my laptop's internal chipset, an Intel i945. The intel driver is one of the first to be using the new RandR 1.2. It turns out that trying to do a multi-adapter setup where one of the adapters uses an RandR 1.2 driver and one uses an RandR 1.1 driver just won't work. And the intel driver has no option to disable RandR 1.2 (it has no RandR 1.1 fallback, it relies on RandR 1.2 to work at all).
So I mailed the X mailing list to complain about this (boy, those guys sure love me today!), and devised Plan B.
Plan B is, basically, going back to the old-school iteration of the Intel X.org driver, known as i810.
Again surprising me (I was planning on at least two days of fun-filled poking before I got this all working), this works fine. With a fairly basic Xinerama xorg.conf (setting up Xinerama is documented in tons of places on the Web, and in man xorg.conf), dual displays - one connected to the USB adapter, one to the internal Intel adapter - was pretty much a snap to get working.
So, problem solved, right?
Well, not quite. One, RandR 1.2 is really nice. Without it, I can't just disconnect my laptop and walk away any more; I have to switch xorg.conf files and restart X if I want to go from the stationary dual-external-head setup to the mobile one-internal-head setup. It would be far nicer if RandR 1.2 drivers played nice in a multi-adapter setup with RandR 1.1 drivers. Or if RandR 1.2 drivers played nice in a multi-adapter setup with other RandR 1.2 drivers (apparently this doesn't work either, though I don't have the means to test), and sisusb was ported to RandR 1.2.
Two, those of you who know much about hardware may have already guessed this one: doing graphics over a USB connection with no compression is not exactly an exercise in pure speed. AGP 1x had more bandwidth than a USB 2.0 connection, so you can imagine what AGP 8x has. And PCI-E 16x. That's not even thinking about latency. And the sisusb driver is not accelerated in any way. This means...it's slow. Redraws are noticeable in just about all operations. It's not a deal breaker for me, as the monitor connected to the USB connection is basically going to spend 95% of its time showing Evolution. But you should take it into consideration if you're thinking about a similar setup. Playing video, for instance, would be just a complete non-starter. The DisplayLink option would be much better in this area, if it worked in Linux.
Three - and this one surprised me the most - the quality just isn't great. The quality of the display from the USB adapter is massively worse than the one from the internal Intel adapter, at 1680x1050 (and 1440x900, I tested that too in case it was better). Basically, it's very slightly fuzzy and colors are just not well separated. Even after tweaking the monitor settings extensively to make the best of it, using Evolution with the Clearlooks GTK+ theme, when looking at the mail list - where each line is supposed to have a slightly different background color, as lists do in GTK+ these days - you can't tell the two colors apart. Each line just looks white.
In the end I switched to the Darklooks theme. The adapter seems to do a bit better with dark colors than light ones, and using this theme, the quality is acceptable. It's still obviously inferior to the quality on the other head, though. So that's something else to take into account.
Still, overall this is an acceptable solution to the situation of wanting another external VGA connector on a laptop that only has one. And probably to several other situations where you want another video adapter in a system which has no spare PCI, AGP or PCI-E slot. These adapters do work rather easily in Linux, they're reasonably widely available, and not expensive (I paid CAN$80 for mine). So it's an option, and it's out there.
The only other real reference I could find that said "yes, I have one, and it works" was a guy in Japan (in Japanese) using one on his OLPC. So I figure this should act as a useful bit of Google bait for anyone in a similar bind. If you want to ask any questions, feel free to post a comment, and I'll answer as best I can.