Hardware
I have the following hardware configuration:
- PC running Ubuntu 10.04
- Onboard video card with one VGA output (Intel P4M800 - Via Unichrome)
- VGA splitter: 1 input, 4 outputs. Up to 2048x1536 (according to spec)
- One 42'' TV/Monitor connected to the splitter via its VGA input
- Two 32'' TV/Monitor connected to the splitter via its VGA input
Problem
With that configuration, Ubuntu only shows 640x480 and 800x800 as possible resolutions. However, if I connect any of the TV/Monitor directly to the PC (via VGA) then Ubuntu shows a long list of possible resolution (I tried several of them and they worked fine).
It seems that X Window System automatic configuration is not working properly. How do I manually configure it? What info should knows of the different devices involved beforehand?
Context: The monitors are intalled in public spaces across one building to display dynamic information that is processed in the PC (a Flash presentation running in Firefox in fullscreen mode).
Update:
I tried the following, as the link provided in the answers said:
Get the modeline for the resolution using
cvt
Created the new mode using
xrandr --newmode
Added the mode to the output display using
xrandr --addmode
Tried to change the resolution using
xrandr --output ... --mode ...
But I get this: xrandr screen cannot be larger than 800x600 (desired size ...)
Here's how monitor autodetection works: Every monitor's firmware contains a chunk of data called EDID which encodes the monitor's resolutions and refresh rates and so on. The video driver makes a hardware call to retrieve this data, via the video card / monitor connection.
Splitters (like KVMs) manipulate the path from the card to the monitor. Some KVMs pass the EDID properly, others don't. My guess is that your splitter is not allowing the EDID to be passed back.
Indeed, I would guess that the system call has a built-in assumption that only one EDID chunk is present on a given connector, so even if it was returning something, it probably wouldn't be what you wanted.
Also, while all monitors return EDID, some TVs don't, or return a corrupted EDID. But since you tested it without the splitter and it worked correctly, I don't think this problem affects you.
Different monitors support different sets of resolutions and frequencies, but all monitors are required by the VESA Standard to support at least two: 640x480 and 800x600. So when X doesn't know anything about the monitor connected to it, it falls back to those two resolutions. That's why those are the only ones you see available.
Anyway, I think in this case you can't rely on EDID to get your monitors magically auto-configured. Instead, you'll need to manually specify the data yourself.
If you had specified your video driver or linked to your Xorg.0.log, I could give you more specific info. The procedure varies depending on what video driver you're using. If it is a KMS-enabled driver like -intel or -ati you have to specify it via the kernel. If you have KMS turned off or are using a non-KMS driver, but the driver supports RANDR (e.g. -fglrx), you can add a modeline using the xrandr command line tool such as documented at the bottom of https://wiki.ubuntu.com/X/Config/Resolution. If you are using a non-KMS, non-RANDR driver such as -nvidia, it is controlled entirely in your /etc/X11/xorg.conf; in this latter case you'll need to look up the vertical and horizontal refresh rates for all the monitors (hopefully they're all close to the same ranges, else you're screwed), and then specify those via the HorizSync and VertRefresh options in xorg.conf. You'll also need to add the resolution in the xorg.conf. Possibly you may need to construct a ModeLine as well, but I'll bet just the HorizSync and VertRefresh will be enough.
Good luck, and if you get stuck be sure to post your /var/log/Xorg.0.log.
It looks like X isn't able to correctly detect the resolution of the splitter.
You can force it to use arbitrary resolutions using xrand. There are some documentation on it, check the Adding undetected resolutions section and the Setting Xrand change persistent.