HackingVGAforFun

Aus LaborWiki
Version vom 3. November 2013, 16:42 Uhr von Siro (Diskussion | Beiträge) (+more test results)
Wechseln zu: Navigation, Suche

VGA

Video Graphics Adapter

pinouts

VGA pinouts

build a fake monitor

  • Terminate the color lines with 75ohms
  • Attach a 24C02 serial eeprom to the specified pins (24c04 - 24c16 is possible to )
  • if no eeprom is at hand, connect ID3 to GND

Modesetting

xrandr

To do so use xrandr:

xrandr --newmode "MODE1"   64.00  1400 1400 1401 1401 700 700 702 702 -hsync -vsync
xrandr --addmode VGA-0 "MODE1"
xrandr --output VGA-0 --mode "MODE1" --right-of LVDS

note: VGA-0 may not apply, it could be VGA1 or VGA too, depending on the driver.
note: the last command assumes LVDS to be your primary active connector, change depending on your system.

alternative arandr

Xorg.conf

Add a ModeLine to your Xorg.conf.

Section "Monitor"
       Identifier      "SyncMaster"
       Option          "VGA-0"
       HorizSync       30-96
       VertRefresh     50-160
       ModeLine        "MODE1" 64.00  1400 1400 1401 1401 700 700 702 702
EndSection

monitor edid

Every monitor has a eeprom containing the EDID.

I used EDID 1.3
Windows Xp

  • accepts
    • standart timings
    • established timings
  • regrets
    • prefered timings

Windows Vista and newer

  • accepts
    • standart timings
    • established timings
  • regrets
    • TODO

Linux

  • The kernel module drm handels all the display stuff
  • it accepts:
    • established timings
    • standart timings
    • prefered timings

hack the kernel module drm for custom edid

This is neccessary if you specify hsync < 1 or vsync < 1 in your edid

  • install linux-source
  • install linux-kernel-headers
  • modify the Makefile
all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules
	cp drm.ko /lib/modules/`uname -r`/kernel/drivers/gpu/drm
	cp drm_kms_helper.ko /lib/modules/`uname -r`/kernel/drivers/gpu/drm
	chmod 755 /lib/modules/`uname -r`/kernel/drivers/gpu/drm
	update-initramfs -u
  • patch drm_edid.c , it doesn't accept vsync_width OR hsync_width to be 0

how to flash a new edid into monitor eeprom

  • remove fglrx or fglrx-legacy, make sure mesa is running !
  • Load the kernelmodule i2c-dev
  • Get i2c-tools
  • build the i2c-tools
  • Become root: Sudo -s
  • Add the tools folder to the PATH: PATH=$PATH:< ... >/i2c-tools/tools
  • Run i2cdump to find the correct BUSID (device at 0x50 and 0x51)
  • Flash new EDID with write-edid.sh
  • Note the input file is plain/text with hexvalues, spaces and newlines only

how to build custom edid

Note

  • the tool outputs .dat-files, that need to be editet by hand, it contains invalid symbols
  • you can use the export function to generate .raw files and use hexdump to convert them to plain/text hex


Tests

Test system

Linux 3.11.6 x86_64 Mesa 9.2.0

Results

Vendor Name Codename Driver VRAM [MB] max bandwidth [MB/s] min vsync min hsync min vblank min hblank
Nvidia Geforce 8600GTS NV84 Mesa 9.2.0 256 310 1 1 0 0

old Results

Mesa 9.0

Label EDID Value Description
AMD RV710 Vsync = 0 no graphics
AMD RV710 Vsync = 1 random graphics
AMD RV710 Htotal = Hactive no graphics
AMD RV710 Front Blanking = 0 normal graphics
AMD RV710 Front Blanking = 1 normal graphics
AMD RV710 Hsync = 0 normal graphics
AMD RV710 Vtotal = Vactive + 2 random graphics

fglrx 8.92

Label EDID Value Description
AMD RV710 Vsync = 0 no graphics
AMD RV710 Vsync = 1 no graphics
AMD RV710 Front Blanking = 0 no graphics
AMD RV710 Front Blanking = 1 normal graphics
AMD RV710 Hsync = 0 random graphics

Links