EDID
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 is a stub.
You can help the wiki by accurately adding more contents 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);
}