Extended Display IDentification is data about the monitor, which the monitor provides to the video card. EDID is the programmatical way to check if a video mode is supported. However, this procedure is rather complex. (See VBE.)
Reading EDID
The first step is, naturally, to actually get the data. This is done through the BIOS - INT 0x10, AX=4F15h, BL=01h, CX = Controller Unit, DX = EDID block, ES:DI = 128-Byte Buffer.
mov ax, 0x4f15
mov bl, 0x01
xor cx, cx
xor dx, dx
int 0x10
;AL = 0x4F if function supported
;AH = status (0 is success, 1 is fail)
;ES:DI contains the EDID
Note that this code will only run in Real Mode or Virtual 8086 Mode.
EDID Data
This page or section is a stub. You can help the wiki by accurately contributing to it.
|
|
EDID record:
Offset (Bytes)
|
Length
|
Description
|
00h
|
8 Bytes
|
Padding
|
08h
|
1 Word
|
Manufacture ID (Big-Endian)
|
0Ah
|
1 Word
|
EDID ID code
|
0Ch
|
1 DWord
|
Serial Number
|
10h
|
1 Byte
|
Manufacture Week
|
11h
|
1 Byte
|
Manufacture Year
|
12h
|
1 Byte
|
EDID Version
|
13h
|
1 Byte
|
EDID Revision
|
14h
|
1 Byte
|
Video Input Type
|
15h
|
1 Byte
|
Max Horizontal Size (cm)
|
16h
|
1 Byte
|
Max Vertical Size (cm)
|
17h
|
1 Byte
|
Gama Factor
|
18h
|
1 Byte
|
DPMS Flags
|
19h
|
10 Bytes
|
Chroma Information
|
23h
|
1 Byte
|
Established Timings 1
|
24h
|
1 Byte
|
Established Timings 2
|
25h
|
1 Byte
|
Manufacture's Reserved Timings
|
26h
|
8 Words
|
Standard Timing Identification
|
36h
|
18 Bytes
|
Detailed Timing Description 1
|
48h
|
18 Bytes
|
Detailed Timing Description 2
|
5Ah
|
18 Bytes
|
Detailed Timing Description 3
|
6Ch
|
18 Bytes
|
Detailed Timing Description 4
|
7Eh
|
1 Byte
|
Unused
|
7Fh
|
1 Byte
|
Checksum (Low Byte of 16-bit sum of 00-7Eh)
|
Video Input Type:
Bit(s)
|
Description
|
0
|
Separate Sync
|
1
|
Composite Sync
|
2
|
Sync on green
|
3-4
|
Unused?
|
5-6
|
Voltage Level
|
7
|
Digital Signal
|
DPMS Flags:
Bit(s)
|
Description
|
0-2
|
Unused?
|
3
|
Display Type (1=RGB)
|
4
|
Unused?
|
5
|
Active Off Supported
|
6
|
Suspend Supported
|
7
|
Standby Supported
|
Chroma Information:
Byte
|
Description
|
0
|
Green X'/Y' and Red X'/Y'
|
1
|
White X'/Y' and Blue X'/Y'
|
2
|
Red Y
|
3
|
Red X
|
4
|
Green Y
|
5
|
Green X
|
6
|
Blue Y
|
7
|
Blue X
|
8
|
White Y
|
9
|
White X
|
Detailed Timing Description:
Byte
|
Description
|
0
|
Horizontal Frequency (kHz)
|
1
|
Vertical Frequency (Hz)
|
2
|
Horizontal Active Time
|
3
|
Horizontal Blanking Time
|
4
|
Horizontal Active Time / Horizontal Blanking Time
|
5
|
Vertical Active time
|
6
|
Vertical Blanking Time
|
7
|
Vertical Active Time / Vertical Blanking Time
|
8
|
Horizontal Sync Offset
|
9
|
Horizontal Sync Pulse-width
|
10
|
Vertical Sync Offset / Vertical Sync Pulse-width
|
11
|
Vertical/Horizontal Sync Offset / Pulse-width
|
12
|
Horizontal Image Size (mm)
|
13
|
Vertical Image Size (mm)
|
14
|
Horizontal Image Size / Vertical Image Size
|
15
|
Horizontal Border
|
16
|
Vertical Border
|
17
|
Type Of Display
|
Type Of Display:
Bit(s)
|
Description
|
7
|
Interlaced
|
5-6
|
Stereo Mode (00 - No Stereo, 01 - Right Stereo Sync High, 10 - Left Stereo Sync High)
|
4-3
|
Sync Type (00 - Analog Composite, 01 - Bipolar Analog Composite, 10 - Digital Composite, 11 - Digital Separate)
|
2
|
Serrate (OR Vertical Sync Polarity IF 'Sync Type' == 11)
|
1
|
Sync Location (OR Horizontal Sync Polarity IF 'Sync Type' == 11)
|
0
|
Unused?
|
Get preferred resolution
void get_preferred_resolution(uint8_t *edid, int *x, int *y) {
*x = edid[0x38] | ((int) (edid[0x3A] & 0xF0) << 4);
*y = edid[0x3B] | ((int) (edid[0x3D] & 0xF0) << 4);
}
See Also
External Links