1 | /*␊ |
2 | * edid.h␊ |
3 | * ␊ |
4 | *␊ |
5 | * Created by Evan Lojewski on 12/1/09.␊ |
6 | * Copyright 2009. All rights reserved.␊ |
7 | *␊ |
8 | */␊ |
9 | //#ifndef __EDID_H__␊ |
10 | //#define __EDID_H__␊ |
11 | ␊ |
12 | ␊ |
13 | #include "libsaio.h"␊ |
14 | ␊ |
15 | #define EDID_BLOCK_SIZE␉128␊ |
16 | #define EDID_V1_BLOCKS_TO_GO_OFFSET 126␊ |
17 | //Slice - some more info aabout EDID␊ |
18 | #define EDID_LENGTH␉␉␉␉0x80␊ |
19 | #define EDID_HEADER␉␉␉␉0x00␊ |
20 | #define EDID_HEADER_END␉␉␉␉0x07␊ |
21 | ␊ |
22 | #define ID_MANUFACTURER_NAME␉␉␉0x08␊ |
23 | #define ID_MANUFACTURER_NAME_END␉␉0x09␊ |
24 | #define ID_MODEL␉␉␉␉0x0a␊ |
25 | ␊ |
26 | #define ID_SERIAL_NUMBER␉␉␉0x0c␊ |
27 | ␊ |
28 | #define MANUFACTURE_WEEK␉␉␉0x10␊ |
29 | #define MANUFACTURE_YEAR␉␉␉0x11␊ |
30 | ␊ |
31 | #define EDID_STRUCT_VERSION␉␉␉0x12␊ |
32 | #define EDID_STRUCT_REVISION␉␉␉0x13␊ |
33 | ␊ |
34 | #define EDID_STRUCT_DISPLAY 0x14␊ |
35 | ␊ |
36 | #define DPMS_FLAGS␉␉␉␉0x18␊ |
37 | #define ESTABLISHED_TIMING_1␉␉␉0x23␊ |
38 | #define ESTABLISHED_TIMING_2␉␉␉0x24␊ |
39 | #define MANUFACTURERS_TIMINGS␉␉␉0x25␊ |
40 | ␊ |
41 | /* standard timings supported */␊ |
42 | #define STD_TIMING 8␊ |
43 | #define STD_TIMING_DESCRIPTION_SIZE 2␊ |
44 | #define STD_TIMING_DESCRIPTIONS_START 0x26␊ |
45 | ␊ |
46 | #define DETAILED_TIMING_DESCRIPTIONS_START␉0x36␊ |
47 | #define DETAILED_TIMING_DESCRIPTION_SIZE␉18␊ |
48 | #define NO_DETAILED_TIMING_DESCRIPTIONS␉␉4␊ |
49 | ␊ |
50 | #define DETAILED_TIMING_DESCRIPTION_1␉␉0x36␊ |
51 | #define DETAILED_TIMING_DESCRIPTION_2␉␉0x48␊ |
52 | #define DETAILED_TIMING_DESCRIPTION_3␉␉0x5a␊ |
53 | #define DETAILED_TIMING_DESCRIPTION_4␉␉0x6c␊ |
54 | ␊ |
55 | #define DESCRIPTOR_DATA␉␉␉␉5␊ |
56 | ␊ |
57 | #define UPPER_NIBBLE( x ) \␊ |
58 | (((128|64|32|16) & (x)) >> 4)␊ |
59 | ␊ |
60 | #define LOWER_NIBBLE( x ) \␊ |
61 | ((1|2|4|8) & (x))␊ |
62 | ␊ |
63 | #define COMBINE_HI_8LO( hi, lo ) \␊ |
64 | ( (((unsigned)hi) << 8) | (unsigned)lo )␊ |
65 | ␊ |
66 | #define COMBINE_HI_4LO( hi, lo ) \␊ |
67 | ( (((unsigned)hi) << 4) | (unsigned)lo )␊ |
68 | ␊ |
69 | #define PIXEL_CLOCK_LO (unsigned)block[ 0 ]␊ |
70 | #define PIXEL_CLOCK_HI (unsigned)block[ 1 ]␊ |
71 | #define PIXEL_CLOCK␉ (COMBINE_HI_8LO( PIXEL_CLOCK_HI,PIXEL_CLOCK_LO )*10000)␊ |
72 | #define H_ACTIVE_LO (unsigned)block[ 2 ]␊ |
73 | #define H_BLANKING_LO (unsigned)block[ 3 ]␊ |
74 | #define H_ACTIVE_HI UPPER_NIBBLE( (unsigned)block[ 4 ] )␊ |
75 | #define H_ACTIVE COMBINE_HI_8LO( H_ACTIVE_HI, H_ACTIVE_LO )␊ |
76 | #define H_BLANKING_HI LOWER_NIBBLE( (unsigned)block[ 4 ] )␊ |
77 | #define H_BLANKING COMBINE_HI_8LO( H_BLANKING_HI, H_BLANKING_LO )␊ |
78 | ␊ |
79 | #define V_ACTIVE_LO (unsigned)block[ 5 ]␊ |
80 | #define V_BLANKING_LO (unsigned)block[ 6 ]␊ |
81 | #define V_ACTIVE_HI UPPER_NIBBLE( (unsigned)block[ 7 ] )␊ |
82 | #define V_ACTIVE COMBINE_HI_8LO( V_ACTIVE_HI, V_ACTIVE_LO )␊ |
83 | #define V_BLANKING_HI LOWER_NIBBLE( (unsigned)block[ 7 ] )␊ |
84 | #define V_BLANKING COMBINE_HI_8LO( V_BLANKING_HI, V_BLANKING_LO )␊ |
85 | ␊ |
86 | #define H_SYNC_OFFSET_LO (unsigned)block[ 8 ]␊ |
87 | #define H_SYNC_WIDTH_LO (unsigned)block[ 9 ]␊ |
88 | ␊ |
89 | #define V_SYNC_OFFSET_LO UPPER_NIBBLE( (unsigned)block[ 10 ] )␊ |
90 | #define V_SYNC_WIDTH_LO LOWER_NIBBLE( (unsigned)block[ 10 ] )␊ |
91 | ␊ |
92 | #define V_SYNC_WIDTH_HI ((unsigned)block[ 11 ] & (1|2))␊ |
93 | #define V_SYNC_OFFSET_HI (((unsigned)block[ 11 ] & (4|8)) >> 2)␊ |
94 | ␊ |
95 | #define H_SYNC_WIDTH_HI (((unsigned)block[ 11 ] & (16|32)) >> 4)␊ |
96 | #define H_SYNC_OFFSET_HI (((unsigned)block[ 11 ] & (64|128)) >> 6)␊ |
97 | ␊ |
98 | #define V_SYNC_WIDTH COMBINE_HI_4LO( V_SYNC_WIDTH_HI, V_SYNC_WIDTH_LO )␊ |
99 | #define V_SYNC_OFFSET COMBINE_HI_4LO( V_SYNC_OFFSET_HI, V_SYNC_OFFSET_LO )␊ |
100 | ␊ |
101 | #define H_SYNC_WIDTH COMBINE_HI_4LO( H_SYNC_WIDTH_HI, H_SYNC_WIDTH_LO )␊ |
102 | #define H_SYNC_OFFSET COMBINE_HI_4LO( H_SYNC_OFFSET_HI, H_SYNC_OFFSET_LO )␊ |
103 | ␊ |
104 | #define H_SIZE_LO (unsigned)block[ 12 ]␊ |
105 | #define V_SIZE_LO (unsigned)block[ 13 ]␊ |
106 | ␊ |
107 | #define H_SIZE_HI UPPER_NIBBLE( (unsigned)block[ 14 ] )␊ |
108 | #define V_SIZE_HI LOWER_NIBBLE( (unsigned)block[ 14 ] )␊ |
109 | ␊ |
110 | #define H_SIZE COMBINE_HI_8LO( H_SIZE_HI, H_SIZE_LO )␊ |
111 | #define V_SIZE COMBINE_HI_8LO( V_SIZE_HI, V_SIZE_LO )␊ |
112 | ␊ |
113 | #define H_BORDER (unsigned)block[ 15 ]␊ |
114 | #define V_BORDER (unsigned)block[ 16 ]␊ |
115 | ␊ |
116 | #define FLAGS (unsigned)block[ 17 ]␊ |
117 | ␊ |
118 | #define INTERLACED (FLAGS&128)␊ |
119 | #define SYNC_TYPE (FLAGS&3<<3)␉/* bits 4,3 */␊ |
120 | #define SYNC_SEPARATE (3<<3)␊ |
121 | #define HSYNC_POSITIVE (FLAGS & 4)␊ |
122 | #define VSYNC_POSITIVE (FLAGS & 2)␊ |
123 | ␊ |
124 | #define V_MIN_RATE block[ 5 ]␊ |
125 | #define V_MAX_RATE block[ 6 ]␊ |
126 | #define H_MIN_RATE block[ 7 ]␊ |
127 | #define H_MAX_RATE block[ 8 ]␊ |
128 | #define MAX_PIXEL_CLOCK (((int)block[ 9 ]) * 10)␊ |
129 | #define GTF_SUPPORT␉␉block[10]␊ |
130 | ␊ |
131 | #define DPMS_ACTIVE_OFF␉␉(1 << 5)␊ |
132 | #define DPMS_SUSPEND␉␉(1 << 6)␊ |
133 | #define DPMS_STANDBY␉␉(1 << 7)␊ |
134 | ␊ |
135 | struct EDID␊ |
136 | {␊ |
137 | UInt8␉header[8];␉␉␉//0␊ |
138 | UInt8␉vendorProduct[4];␉//8␊ |
139 | UInt8␉serialNumber[4];␉//12␊ |
140 | UInt8␉weekOfManufacture;␉//16␊ |
141 | UInt8␉yearOfManufacture;␉//17␊ |
142 | UInt8␉version;␉␉␉//18␊ |
143 | UInt8␉revision;␉␉␉//19␊ |
144 | UInt8␉displayParams[5];␉//20␊ |
145 | UInt8␉colorCharacteristics[10];␉//25␊ |
146 | UInt8␉establishedTimings[3];␉␉//35␊ |
147 | UInt16␉standardTimings[8];␉␉␉//38␊ |
148 | UInt8␉detailedTimings[72];␉␉//54␊ |
149 | UInt8␉extension;␉␉␉␉␉//126␊ |
150 | UInt8␉checksum;␉␉␉␉␉//127␊ |
151 | };␊ |
152 | ␊ |
153 | char* readEDID();␊ |
154 | void getResolution(UInt32* x, UInt32* y, UInt32* bp);␊ |
155 | ␊ |
156 | //#endif |