Chameleon

Chameleon Svn Source Tree

Root/branches/Chimera/i386/modules/Resolution/include/edid.h

1/*
2 * edid.h
3 *
4 *
5 * Created by Evan Lojewski on 12/1/09.
6 * Copyright 2009. All rights reserved.
7 *
8 * Slice 2010, based on Joblo works
9 */
10//#ifndef __EDID_H__
11//#define __EDID_H__
12
13
14#include "libsaio.h"
15
16#define EDID_BLOCK_SIZE128
17#define EDID_V1_BLOCKS_TO_GO_OFFSET 126
18//Slice - some more info about EDID
19#define EDID_LENGTH0x80
20#define EDID_HEADER0x00
21#define EDID_HEADER_END0x07
22
23#define ID_MANUFACTURER_NAME0x08
24#define ID_MANUFACTURER_NAME_END0x09
25#define ID_MODEL0x0a
26
27#define ID_SERIAL_NUMBER0x0c
28
29#define MANUFACTURE_WEEK0x10
30#define MANUFACTURE_YEAR0x11
31
32#define EDID_STRUCT_VERSION0x12
33#define EDID_STRUCT_REVISION0x13
34
35#define EDID_STRUCT_DISPLAY 0x14
36
37#define DPMS_FLAGS0x18
38#define ESTABLISHED_TIMING_10x23
39#define ESTABLISHED_TIMING_20x24
40#define MANUFACTURERS_TIMINGS0x25
41
42/* standard timings supported */
43#define STD_TIMING 8
44#define STD_TIMING_DESCRIPTION_SIZE 2
45#define STD_TIMING_DESCRIPTIONS_START 0x26
46
47#define DETAILED_TIMING_DESCRIPTIONS_START0x36
48#define DETAILED_TIMING_DESCRIPTION_SIZE18
49#define NO_DETAILED_TIMING_DESCRIPTIONS4
50
51#define DETAILED_TIMING_DESCRIPTION_10x36
52#define DETAILED_TIMING_DESCRIPTION_20x48
53#define DETAILED_TIMING_DESCRIPTION_30x5a
54#define DETAILED_TIMING_DESCRIPTION_40x6c
55
56#define DESCRIPTOR_DATA5
57
58#define UPPER_NIBBLE( x ) \
59(((128|64|32|16) & (x)) >> 4)
60
61#define LOWER_NIBBLE( x ) \
62((1|2|4|8) & (x))
63
64#define COMBINE_HI_8LO( hi, lo ) \
65( (((unsigned)hi) << 8) | (unsigned)lo )
66
67#define COMBINE_HI_4LO( hi, lo ) \
68( (((unsigned)hi) << 4) | (unsigned)lo )
69
70#define PIXEL_CLOCK_LO (unsigned)block[ 0 ]
71#define PIXEL_CLOCK_HI (unsigned)block[ 1 ]
72#define PIXEL_CLOCK (COMBINE_HI_8LO( PIXEL_CLOCK_HI,PIXEL_CLOCK_LO )*10000)
73#define H_ACTIVE_LO (unsigned)block[ 2 ]
74#define H_BLANKING_LO (unsigned)block[ 3 ]
75#define H_ACTIVE_HI UPPER_NIBBLE( (unsigned)block[ 4 ] )
76#define H_ACTIVE COMBINE_HI_8LO( H_ACTIVE_HI, H_ACTIVE_LO )
77#define H_BLANKING_HI LOWER_NIBBLE( (unsigned)block[ 4 ] )
78#define H_BLANKING COMBINE_HI_8LO( H_BLANKING_HI, H_BLANKING_LO )
79
80#define V_ACTIVE_LO (unsigned)block[ 5 ]
81#define V_BLANKING_LO (unsigned)block[ 6 ]
82#define V_ACTIVE_HI UPPER_NIBBLE( (unsigned)block[ 7 ] )
83#define V_ACTIVE COMBINE_HI_8LO( V_ACTIVE_HI, V_ACTIVE_LO )
84#define V_BLANKING_HI LOWER_NIBBLE( (unsigned)block[ 7 ] )
85#define V_BLANKING COMBINE_HI_8LO( V_BLANKING_HI, V_BLANKING_LO )
86
87#define H_SYNC_OFFSET_LO (unsigned)block[ 8 ]
88#define H_SYNC_WIDTH_LO (unsigned)block[ 9 ]
89
90#define V_SYNC_OFFSET_LO UPPER_NIBBLE( (unsigned)block[ 10 ] )
91#define V_SYNC_WIDTH_LO LOWER_NIBBLE( (unsigned)block[ 10 ] )
92
93#define V_SYNC_WIDTH_HI ((unsigned)block[ 11 ] & (1|2))
94#define V_SYNC_OFFSET_HI (((unsigned)block[ 11 ] & (4|8)) >> 2)
95
96#define H_SYNC_WIDTH_HI (((unsigned)block[ 11 ] & (16|32)) >> 4)
97#define H_SYNC_OFFSET_HI (((unsigned)block[ 11 ] & (64|128)) >> 6)
98
99#define V_SYNC_WIDTH COMBINE_HI_4LO( V_SYNC_WIDTH_HI, V_SYNC_WIDTH_LO )
100#define V_SYNC_OFFSET COMBINE_HI_4LO( V_SYNC_OFFSET_HI, V_SYNC_OFFSET_LO )
101
102#define H_SYNC_WIDTH COMBINE_HI_4LO( H_SYNC_WIDTH_HI, H_SYNC_WIDTH_LO )
103#define H_SYNC_OFFSET COMBINE_HI_4LO( H_SYNC_OFFSET_HI, H_SYNC_OFFSET_LO )
104
105#define H_SIZE_LO (unsigned)block[ 12 ]
106#define V_SIZE_LO (unsigned)block[ 13 ]
107
108#define H_SIZE_HI UPPER_NIBBLE( (unsigned)block[ 14 ] )
109#define V_SIZE_HI LOWER_NIBBLE( (unsigned)block[ 14 ] )
110
111#define H_SIZE COMBINE_HI_8LO( H_SIZE_HI, H_SIZE_LO )
112#define V_SIZE COMBINE_HI_8LO( V_SIZE_HI, V_SIZE_LO )
113
114#define H_BORDER (unsigned)block[ 15 ]
115#define V_BORDER (unsigned)block[ 16 ]
116
117#define FLAGS (unsigned)block[ 17 ]
118
119#define INTERLACED (FLAGS&128)
120#define SYNC_TYPE (FLAGS&3<<3)/* bits 4,3 */
121#define SYNC_SEPARATE (3<<3)
122#define HSYNC_POSITIVE (FLAGS & 4)
123#define VSYNC_POSITIVE (FLAGS & 2)
124
125#define V_MIN_RATE block[ 5 ]
126#define V_MAX_RATE block[ 6 ]
127#define H_MIN_RATE block[ 7 ]
128#define H_MAX_RATE block[ 8 ]
129#define MAX_PIXEL_CLOCK (((int)block[ 9 ]) * 10)
130#define GTF_SUPPORTblock[10]
131
132#define DPMS_ACTIVE_OFF(1 << 5)
133#define DPMS_SUSPEND(1 << 6)
134#define DPMS_STANDBY(1 << 7)
135
136struct EDID
137{
138 UInt8header[8];//0
139 UInt8vendorProduct[4];//8
140 UInt8serialNumber[4];//12
141 UInt8weekOfManufacture;//16
142 UInt8yearOfManufacture;//17
143 UInt8version;//18
144 UInt8revision;//19
145 UInt8displayParams[5];//20
146 UInt8colorCharacteristics[10];//25
147 UInt8establishedTimings[3];//35
148 UInt16standardTimings[8];//38
149 UInt8detailedTimings[72];//54
150 UInt8extension;//126
151 UInt8checksum;//127
152};
153
154
155typedef struct _edid_mode {
156unsigned short pixel_clock;
157unsigned short h_active;
158unsigned short h_blanking;
159unsigned short v_active;
160unsigned short v_blanking;
161unsigned short h_sync_offset;
162unsigned short h_sync_width;
163unsigned short v_sync_offset;
164unsigned short v_sync_width;
165} edid_mode;
166
167
168char* readEDID();
169void getResolution(UInt32* x, UInt32* y, UInt32* bp);
170int fb_parse_edid(struct EDID *edid, edid_mode* var);
171int getEDID( void * edidBlock, UInt8 block);
172//#endif

Archive Download this file

Revision: 2250