edidreg.h revision 1.1 1 1.1 gdamore /* $NetBSD: edidreg.h,v 1.1 2006/05/11 01:49:53 gdamore Exp $ */
2 1.1 gdamore
3 1.1 gdamore /*-
4 1.1 gdamore * Copyright (c) 2006 Itronix Inc.
5 1.1 gdamore * All rights reserved.
6 1.1 gdamore *
7 1.1 gdamore * Written by Garrett D'Amore for Itronix Inc.
8 1.1 gdamore *
9 1.1 gdamore * Redistribution and use in source and binary forms, with or without
10 1.1 gdamore * modification, are permitted provided that the following conditions
11 1.1 gdamore * are met:
12 1.1 gdamore * 1. Redistributions of source code must retain the above copyright
13 1.1 gdamore * notice, this list of conditions and the following disclaimer.
14 1.1 gdamore * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 gdamore * notice, this list of conditions and the following disclaimer in the
16 1.1 gdamore * documentation and/or other materials provided with the distribution.
17 1.1 gdamore * 3. The name of Itronix Inc. may not be used to endorse
18 1.1 gdamore * or promote products derived from this software without specific
19 1.1 gdamore * prior written permission.
20 1.1 gdamore *
21 1.1 gdamore * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND ANY EXPRESS
22 1.1 gdamore * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 1.1 gdamore * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 1.1 gdamore * ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
25 1.1 gdamore * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 1.1 gdamore * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27 1.1 gdamore * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 1.1 gdamore * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 1.1 gdamore * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 1.1 gdamore * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 1.1 gdamore * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 1.1 gdamore */
33 1.1 gdamore
34 1.1 gdamore #ifndef _DEV_VIDEOMODE_EDIDREG_H
35 1.1 gdamore #define _DEV_VIDEOMODE_EDIDREG_H
36 1.1 gdamore
37 1.1 gdamore #define EDID_OFFSET_SIGNATURE 0x00
38 1.1 gdamore #define EDID_OFFSET_MANUFACTURER_ID 0x08
39 1.1 gdamore #define EDID_OFFSET_PRODUCT_ID 0x0a
40 1.1 gdamore #define EDID_OFFSET_SERIAL_NUMBER 0x0c
41 1.1 gdamore #define EDID_OFFSET_MANUFACTURE_WEEK 0x10
42 1.1 gdamore #define EDID_OFFSET_MANUFACTURE_YEAR 0x11
43 1.1 gdamore #define EDID_OFFSET_VERSION 0x12
44 1.1 gdamore #define EDID_OFFSET_REVISION 0x13
45 1.1 gdamore #define EDID_OFFSET_VIDEO_INPUT 0x14
46 1.1 gdamore #define EDID_OFFSET_MAX_HSIZE 0x15 /* in cm */
47 1.1 gdamore #define EDID_OFFSET_MAX_VSIZE 0x16
48 1.1 gdamore #define EDID_OFFSET_GAMMA 0x17
49 1.1 gdamore #define EDID_OFFSET_FEATURE 0x18
50 1.1 gdamore #define EDID_OFFSET_CHROMA 0x19
51 1.1 gdamore #define EDID_OFFSET_EST_TIMING_1 0x23
52 1.1 gdamore #define EDID_OFFSET_EST_TIMING_2 0x24
53 1.1 gdamore #define EDID_OFFSET_MFG_TIMING 0x25
54 1.1 gdamore #define EDID_OFFSET_STD_TIMING 0x26
55 1.1 gdamore #define EDID_OFFSET_DESC_BLOCK 0x36
56 1.1 gdamore
57 1.1 gdamore #define EDID_SIGNATURE { 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0 }
58 1.1 gdamore
59 1.1 gdamore /* assume x is 16-bit value */
60 1.1 gdamore #define EDID_VENDOR_ID(ptr) ((((ptr)[8]) << 8) + ptr[9])
61 1.1 gdamore #define EDID_MANFID_0(x) ((((x) >> 10) & 0x1f) + '@')
62 1.1 gdamore #define EDID_MANFID_1(x) ((((x) >> 5) & 0x1f) + '@')
63 1.1 gdamore #define EDID_MANFID_2(x) ((((x) >> 0) & 0x1f) + '@')
64 1.1 gdamore
65 1.1 gdamore /* relative to edid block */
66 1.1 gdamore #define EDID_PRODUCT_ID(ptr) (((ptr)[10]) | (((ptr)[11]) << 8))
67 1.1 gdamore #define EDID_SERIAL_NUMBER(ptr) (((ptr)[12] << 24) + \
68 1.1 gdamore ((ptr)[13] << 16) + \
69 1.1 gdamore ((ptr)[14] << 8) + \
70 1.1 gdamore (ptr)[15])
71 1.1 gdamore
72 1.1 gdamore /* relative to edid block */
73 1.1 gdamore #define EDID_WEEK(ptr) ((ptr)[16])
74 1.1 gdamore #define EDID_YEAR(ptr) (((ptr)[17]) + 1990)
75 1.1 gdamore
76 1.1 gdamore #define EDID_VERSION(ptr) ((ptr)[18])
77 1.1 gdamore #define EDID_REVISION(ptr) ((ptr)[19])
78 1.1 gdamore
79 1.1 gdamore #define EDID_VIDEO_INPUT(ptr) ((ptr)[20])
80 1.1 gdamore #define EDID_VIDEO_INPUT_DIGITAL 0x80
81 1.1 gdamore /* if INPUT_BIT_DIGITAL set */
82 1.1 gdamore #define EDID_VIDEO_INPUT_DFP1_COMPAT 0x01
83 1.1 gdamore /* if INPUT_BIT_DIGITAL not set */
84 1.1 gdamore #define EDID_VIDEO_INPUT_BLANK_TO_BLACK 0x10
85 1.1 gdamore #define EDID_VIDEO_INPUT_SEPARATE_SYNCS 0x08
86 1.1 gdamore #define EDID_VIDEO_INPUT_COMPOSITE_SYNC 0x04
87 1.1 gdamore #define EDID_VIDEO_INPUT_SYNC_ON_GRN 0x02
88 1.1 gdamore #define EDID_VIDEO_INPUT_SERRATION 0x01
89 1.1 gdamore #define EDID_VIDEO_INPUT_LEVEL(x) (((x) & 0x60) >> 5)
90 1.1 gdamore /* meanings of level bits are as follows, I don't know names */
91 1.1 gdamore /* 0 = 0.7,0.3, 1 = 0.714,0.286, 2 = 1.0,0.4, 3 = 0.7,0.0 */
92 1.1 gdamore
93 1.1 gdamore /* relative to edid block */
94 1.1 gdamore #define EDID_MAX_HSIZE(ptr) ((ptr)[21]) /* cm */
95 1.1 gdamore #define EDID_MAX_VSIZE(ptr) ((ptr)[22]) /* cm */
96 1.1 gdamore /* gamma is scaled by 100 (avoid fp), e.g. 213 == 2.13 */
97 1.1 gdamore #define _GAMMA(x) ((x) == 0xff ? 100 : ((x) + 100))
98 1.1 gdamore #define EDID_GAMMA(ptr) _GAMMA(ptr[23])
99 1.1 gdamore
100 1.1 gdamore #define EDID_FEATURES(ptr) ((ptr)[24])
101 1.1 gdamore #define EDID_FEATURES_STANDBY 0x80
102 1.1 gdamore #define EDID_FEATURES_SUSPEND 0x40
103 1.1 gdamore #define EDID_FEATURES_ACTIVE_OFF 0x20
104 1.1 gdamore #define EDID_FEATURES_DISP_TYPE(x) (((x) & 0x18) >> 3)
105 1.1 gdamore #define EDID_FEATURES_DISP_TYPE_MONO 0
106 1.1 gdamore #define EDID_FEATURES_DISP_TYPE_RGB 1
107 1.1 gdamore #define EDID_FEATURES_DISP_TYPE_NON_RGB 2
108 1.1 gdamore #define EDID_FEATURES_DISP_TYPE_UNDEFINED 3
109 1.1 gdamore #define EDID_FEATURES_STD_COLOR 0x04
110 1.1 gdamore #define EDID_FEATURES_PREFERRED_TIMING 0x02
111 1.1 gdamore #define EDID_FEATURES_DEFAULT_GTF 0x01
112 1.1 gdamore
113 1.1 gdamore /* chroma values 0.0 - 0.999 scaled as 0-999 */
114 1.1 gdamore #define _CHLO(byt, shft) (((byt) >> (shft)) & 0x3)
115 1.1 gdamore #define _CHHI(byt) ((byt) << 2)
116 1.1 gdamore #define _CHHILO(ptr, l, s, h) (_CHLO((ptr)[l], s) | _CHHI((ptr)[h]))
117 1.1 gdamore #define _CHROMA(ptr, l, s, h) ((_CHHILO(ptr, l, s, h) * 1000) / 1024)
118 1.1 gdamore
119 1.1 gdamore #define EDID_CHROMA_REDX(ptr) (_CHROMA(ptr, 25, 6, 27))
120 1.1 gdamore #define EDID_CHROMA_REDY(ptr) (_CHROMA(ptr, 25, 4, 28))
121 1.1 gdamore #define EDID_CHROMA_GREENX(ptr) (_CHROMA(ptr, 25, 2, 29))
122 1.1 gdamore #define EDID_CHROMA_GREENY(ptr) (_CHROMA(ptr, 25, 0, 30))
123 1.1 gdamore #define EDID_CHROMA_BLUEX(ptr) (_CHROMA(ptr, 26, 6, 31))
124 1.1 gdamore #define EDID_CHROMA_BLUEY(ptr) (_CHROMA(ptr, 26, 4, 32))
125 1.1 gdamore #define EDID_CHROMA_WHITEX(ptr) (_CHROMA(ptr, 26, 2, 33))
126 1.1 gdamore #define EDID_CHROMA_WHITEY(ptr) (_CHROMA(ptr, 26, 0, 34))
127 1.1 gdamore
128 1.1 gdamore /* relative to edid block */
129 1.1 gdamore #define EDID_EST_TIMING(ptr) (((ptr)[35] << 8) | (ptr)[35])
130 1.1 gdamore #define EDID_EST_TIMING_720_400_70 0x8000 /* 720x400 @ 70Hz */
131 1.1 gdamore #define EDID_EST_TIMING_720_400_88 0x4000 /* 720x400 @ 88Hz */
132 1.1 gdamore #define EDID_EST_TIMING_640_480_60 0x2000 /* 640x480 @ 60Hz */
133 1.1 gdamore #define EDID_EST_TIMING_640_480_67 0x1000 /* 640x480 @ 67Hz */
134 1.1 gdamore #define EDID_EST_TIMING_640_480_72 0x0800 /* 640x480 @ 72Hz */
135 1.1 gdamore #define EDID_EST_TIMING_640_480_75 0x0400 /* 640x480 @ 75Hz */
136 1.1 gdamore #define EDID_EST_TIMING_800_600_56 0x0200 /* 800x600 @ 56Hz */
137 1.1 gdamore #define EDID_EST_TIMING_800_600_60 0x0100 /* 800x600 @ 60Hz */
138 1.1 gdamore #define EDID_EST_TIMING_800_600_72 0x0080 /* 800x600 @ 72Hz */
139 1.1 gdamore #define EDID_EST_TIMING_800_600_75 0x0040 /* 800x600 @ 75Hz */
140 1.1 gdamore #define EDID_EST_TIMING_832_624_75 0x0020 /* 832x624 @ 75Hz */
141 1.1 gdamore #define EDID_EST_TIMING_1024_768_87I 0x0010 /* 1024x768i @ 87Hz */
142 1.1 gdamore #define EDID_EST_TIMING_1024_768_60 0x0008 /* 1024x768 @ 60Hz */
143 1.1 gdamore #define EDID_EST_TIMING_1024_768_70 0x0004 /* 1024x768 @ 70Hz */
144 1.1 gdamore #define EDID_EST_TIMING_1024_768_75 0x0002 /* 1024x768 @ 75Hz */
145 1.1 gdamore #define EDID_EST_TIMING_1280_1024_75 0x0001 /* 1280x1024 @ 75Hz */
146 1.1 gdamore
147 1.1 gdamore /*
148 1.1 gdamore * N.B.: ptr is relative to standard timing block - used for standard timing
149 1.1 gdamore * descriptors as well as standard timings section of edid!
150 1.1 gdamore */
151 1.1 gdamore #define EDID_STD_TIMING_HRES(ptr) ((((ptr)[0]) * 8) + 248)
152 1.1 gdamore #define EDID_STD_TIMING_VFREQ(ptr) ((((ptr)[1]) & 0x3f) + 60)
153 1.1 gdamore #define EDID_STD_TIMING_RATIO(ptr) ((ptr)[1] & 0xc0)
154 1.1 gdamore #define EDID_STD_TIMING_RATIO_16_10 0x00
155 1.1 gdamore #define EDID_STD_TIMING_RATIO_4_3 0x40
156 1.1 gdamore #define EDID_STD_TIMING_RATIO_5_4 0x80
157 1.1 gdamore #define EDID_STD_TIMING_RATIO_16_9 0xc0
158 1.1 gdamore
159 1.1 gdamore #define EDID_STD_TIMING_SIZE 16
160 1.1 gdamore #define EDID_STD_TIMING_COUNT 8
161 1.1 gdamore
162 1.1 gdamore /*
163 1.1 gdamore * N.B.: ptr is relative to descriptor block start
164 1.1 gdamore */
165 1.1 gdamore #define EDID_BLOCK_SIZE 18
166 1.1 gdamore #define EDID_BLOCK_COUNT 4
167 1.1 gdamore
168 1.1 gdamore /* detailed timing block.... what a mess */
169 1.1 gdamore #define EDID_BLOCK_IS_DET_TIMING(ptr) ((ptr)[0] | (ptr)[1])
170 1.1 gdamore
171 1.1 gdamore #define EDID_DET_TIMING_DOT_CLOCK(ptr) (((ptr)[0] | ((ptr)[1] << 8)) * 10000)
172 1.1 gdamore #define _HACT_LO(ptr) ((ptr)[2])
173 1.1 gdamore #define _HBLK_LO(ptr) ((ptr)[3])
174 1.1 gdamore #define _HACT_HI(ptr) (((ptr)[4] & 0xf0) << 4)
175 1.1 gdamore #define _HBLK_HI(ptr) (((ptr)[4] & 0x0f) << 8)
176 1.1 gdamore #define EDID_DET_TIMING_HACTIVE(ptr) (_HACT_LO(ptr) | _HACT_HI(ptr))
177 1.1 gdamore #define EDID_DET_TIMING_HBLANK(ptr) (_HBLK_LO(ptr) | _HBLK_HI(ptr))
178 1.1 gdamore #define _VACT_LO(ptr) ((ptr)[5])
179 1.1 gdamore #define _VBLK_LO(ptr) ((ptr)[6])
180 1.1 gdamore #define _VACT_HI(ptr) (((ptr)[7] & 0xf0) << 4)
181 1.1 gdamore #define _VBLK_HI(ptr) (((ptr)[7] & 0x0f) << 8)
182 1.1 gdamore #define EDID_DET_TIMING_VACTIVE(ptr) (_VACT_LO(ptr) | _VACT_HI(ptr))
183 1.1 gdamore #define EDID_DET_TIMING_VBLANK(ptr) (_VBLK_LO(ptr) | _VBLK_HI(ptr))
184 1.1 gdamore #define _HOFF_LO(ptr) ((ptr)[8])
185 1.1 gdamore #define _HWID_LO(ptr) ((ptr)[9])
186 1.1 gdamore #define _VOFF_LO(ptr) ((ptr)[10] >> 4)
187 1.1 gdamore #define _VWID_LO(ptr) ((ptr)[10] & 0xf)
188 1.1 gdamore #define _HOFF_HI(ptr) (((ptr)[11] & 0xc0) << 2)
189 1.1 gdamore #define _HWID_HI(ptr) (((ptr)[11] & 0x30) << 4)
190 1.1 gdamore #define _VOFF_HI(ptr) (((ptr)[11] & 0x0c) << 2)
191 1.1 gdamore #define _VWID_HI(ptr) (((ptr)[11] & 0x03) << 4)
192 1.1 gdamore #define EDID_DET_TIMING_HSYNC_OFFSET(ptr) (_HOFF_LO(ptr) | _HOFF_HI(ptr))
193 1.1 gdamore #define EDID_DET_TIMING_HSYNC_WIDTH(ptr) (_HWID_LO(ptr) | _HWID_HI(ptr))
194 1.1 gdamore #define EDID_DET_TIMING_VSYNC_OFFSET(ptr) (_VOFF_LO(ptr) | _VOFF_HI(ptr))
195 1.1 gdamore #define EDID_DET_TIMING_VSYNC_WIDTH(ptr) (_VWID_LO(ptr) | _VWID_HI(ptr))
196 1.1 gdamore #define _HSZ_LO(ptr) ((ptr)[12])
197 1.1 gdamore #define _VSZ_LO(ptr) ((ptr)[13])
198 1.1 gdamore #define _HSZ_HI(ptr) (((ptr)[14] & 0xf0) << 4)
199 1.1 gdamore #define _VSZ_HI(ptr) (((ptr)[14] & 0x0f) << 8)
200 1.1 gdamore #define EDID_DET_TIMING_HSIZE(ptr) (_HSZ_LO(ptr) | _HSZ_HI(ptr))
201 1.1 gdamore #define EDID_DET_TIMING_VSIZE(ptr) (_VSZ_LO(ptr) | _VSZ_HI(ptr))
202 1.1 gdamore #define EDID_DET_TIMING_HBORDER(ptr) ((ptr)[15])
203 1.1 gdamore #define EDID_DET_TIMING_VBORDER(ptr) ((ptr)[16])
204 1.1 gdamore #define EDID_DET_TIMING_FLAGS(ptr) ((ptr)[17])
205 1.1 gdamore #define EDID_DET_TIMING_FLAG_INTERLACE 0x80
206 1.1 gdamore #define EDID_DET_TIMING_FLAG_STEREO 0x60 /* wtf? */
207 1.1 gdamore #define EDID_DET_TIMING_FLAG_SYNC_SEPARATE 0x18
208 1.1 gdamore #define EDID_DET_TIMING_FLAG_HSYNC_POSITIVE 0x04
209 1.1 gdamore #define EDID_DET_TIMING_FLAG_VSYNC_POSITIVE 0x02
210 1.1 gdamore #define EDID_DET_TIMING_FLAG_STEREO1 0x01 /* wtf? */
211 1.1 gdamore
212 1.1 gdamore
213 1.1 gdamore /* N.B.: these tests assume that we already checked for detailed timing! */
214 1.1 gdamore #define EDID_BLOCK_TYPE(ptr) ((ptr)[3])
215 1.1 gdamore
216 1.1 gdamore #define EDID_DESC_BLOCK_SIZE 18
217 1.1 gdamore #define EDID_DESC_BLOCK_TYPE_SERIAL 0xFF
218 1.1 gdamore #define EDID_DESC_BLOCK_TYPE_ASCII 0xFE
219 1.1 gdamore #define EDID_DESC_BLOCK_TYPE_RANGE 0xFD
220 1.1 gdamore #define EDID_DESC_BLOCK_TYPE_NAME 0xFC
221 1.1 gdamore #define EDID_DESC_BLOCK_TYPE_COLOR_POINT 0xFB
222 1.1 gdamore #define EDID_DESC_BLOCK_TYPE_STD_TIMING 0xFA
223 1.1 gdamore
224 1.1 gdamore /* used for descriptors 0xFF, 0xFE, and 0xFC */
225 1.1 gdamore #define EDID_DESC_ASCII_DATA_OFFSET 5
226 1.1 gdamore #define EDID_DESC_ASCII_DATA_LEN 13
227 1.1 gdamore
228 1.1 gdamore #define EDID_DESC_RANGE_MIN_VFREQ(ptr) ((ptr)[5]) /* Hz */
229 1.1 gdamore #define EDID_DESC_RANGE_MAX_VFREQ(ptr) ((ptr)[6]) /* Hz */
230 1.1 gdamore #define EDID_DESC_RANGE_MIN_HFREQ(ptr) ((ptr)[7]) /* kHz */
231 1.1 gdamore #define EDID_DESC_RANGE_MAX_HFREQ(ptr) ((ptr)[8]) /* kHz */
232 1.1 gdamore #define EDID_DESC_RANGE_MAX_CLOCK(ptr) (((ptr)[9]) * 10) /* MHz */
233 1.1 gdamore #define EDID_DESC_RANGE_HAVE_GTF2(ptr) (((ptr)[10]) == 0x02)
234 1.1 gdamore #define EDID_DESC_RANGE_GTF2_HFREQ(ptr) (((ptr)[12]) * 2)
235 1.1 gdamore #define EDID_DESC_RANGE_GTF2_C(ptr) (((ptr)[13]) / 2)
236 1.1 gdamore #define EDID_DESC_RANGE_GTF2_M(ptr) ((ptr)[14] + ((ptr)[15] << 8))
237 1.1 gdamore #define EDID_DESC_RANGE_GTF2_K(ptr) ((ptr)[16])
238 1.1 gdamore #define EDID_DESC_RANGE_GTF2_J(ptr) ((ptr)[17] / 2)
239 1.1 gdamore
240 1.1 gdamore #define EDID_DESC_COLOR_WHITEX(ptr)
241 1.1 gdamore #define EDID_DESC_COLOR_WHITE_INDEX_1(ptr) ((ptr)[5])
242 1.1 gdamore #define EDID_DESC_COLOR_WHITEX_1(ptr) _CHROMA(ptr, 6, 2, 7)
243 1.1 gdamore #define EDID_DESC_COLOR_WHITEY_1(ptr) _CHROMA(ptr, 6, 0, 8)
244 1.1 gdamore #define EDID_DESC_COLOR_GAMMA_1(ptr) _GAMMA(ptr[9])
245 1.1 gdamore #define EDID_DESC_COLOR_WHITE_INDEX_2(ptr) ((ptr)[10])
246 1.1 gdamore #define EDID_DESC_COLOR_WHITEX_2(ptr) _CHROMA(ptr, 11, 2, 12)
247 1.1 gdamore #define EDID_DESC_COLOR_WHITEY_2(ptr) _CHROMA(ptr, 11, 0, 13)
248 1.1 gdamore #define EDID_DESC_COLOR_GAMMA_2(ptr) _GAMMA(ptr[14])
249 1.1 gdamore
250 1.1 gdamore #define EDID_DESC_STD_TIMING_START 5
251 1.1 gdamore #define EDID_DESC_STD_TIMING_COUNT 6
252 1.1 gdamore
253 1.1 gdamore #endif /* _DEV_VIDEOMODE_EDIDREG_H */
254