1*3f50a23cSjmcneill /* $NetBSD: edidreg.h,v 1.4 2014/11/17 00:46:04 jmcneill Exp $ */ 26594783dSgdamore 36594783dSgdamore /*- 46594783dSgdamore * Copyright (c) 2006 Itronix Inc. 56594783dSgdamore * All rights reserved. 66594783dSgdamore * 76594783dSgdamore * Written by Garrett D'Amore for Itronix Inc. 86594783dSgdamore * 96594783dSgdamore * Redistribution and use in source and binary forms, with or without 106594783dSgdamore * modification, are permitted provided that the following conditions 116594783dSgdamore * are met: 126594783dSgdamore * 1. Redistributions of source code must retain the above copyright 136594783dSgdamore * notice, this list of conditions and the following disclaimer. 146594783dSgdamore * 2. Redistributions in binary form must reproduce the above copyright 156594783dSgdamore * notice, this list of conditions and the following disclaimer in the 166594783dSgdamore * documentation and/or other materials provided with the distribution. 176594783dSgdamore * 3. The name of Itronix Inc. may not be used to endorse 186594783dSgdamore * or promote products derived from this software without specific 196594783dSgdamore * prior written permission. 206594783dSgdamore * 216594783dSgdamore * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND ANY EXPRESS 226594783dSgdamore * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 236594783dSgdamore * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 246594783dSgdamore * ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY 256594783dSgdamore * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 266594783dSgdamore * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 276594783dSgdamore * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 286594783dSgdamore * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 296594783dSgdamore * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 306594783dSgdamore * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 316594783dSgdamore * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 326594783dSgdamore */ 336594783dSgdamore 346594783dSgdamore #ifndef _DEV_VIDEOMODE_EDIDREG_H 356594783dSgdamore #define _DEV_VIDEOMODE_EDIDREG_H 366594783dSgdamore 376594783dSgdamore #define EDID_OFFSET_SIGNATURE 0x00 386594783dSgdamore #define EDID_OFFSET_MANUFACTURER_ID 0x08 396594783dSgdamore #define EDID_OFFSET_PRODUCT_ID 0x0a 406594783dSgdamore #define EDID_OFFSET_SERIAL_NUMBER 0x0c 416594783dSgdamore #define EDID_OFFSET_MANUFACTURE_WEEK 0x10 426594783dSgdamore #define EDID_OFFSET_MANUFACTURE_YEAR 0x11 436594783dSgdamore #define EDID_OFFSET_VERSION 0x12 446594783dSgdamore #define EDID_OFFSET_REVISION 0x13 456594783dSgdamore #define EDID_OFFSET_VIDEO_INPUT 0x14 466594783dSgdamore #define EDID_OFFSET_MAX_HSIZE 0x15 /* in cm */ 476594783dSgdamore #define EDID_OFFSET_MAX_VSIZE 0x16 486594783dSgdamore #define EDID_OFFSET_GAMMA 0x17 496594783dSgdamore #define EDID_OFFSET_FEATURE 0x18 506594783dSgdamore #define EDID_OFFSET_CHROMA 0x19 516594783dSgdamore #define EDID_OFFSET_EST_TIMING_1 0x23 526594783dSgdamore #define EDID_OFFSET_EST_TIMING_2 0x24 536594783dSgdamore #define EDID_OFFSET_MFG_TIMING 0x25 546594783dSgdamore #define EDID_OFFSET_STD_TIMING 0x26 556594783dSgdamore #define EDID_OFFSET_DESC_BLOCK 0x36 566594783dSgdamore 576594783dSgdamore #define EDID_SIGNATURE { 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0 } 586594783dSgdamore 596594783dSgdamore /* assume x is 16-bit value */ 606594783dSgdamore #define EDID_VENDOR_ID(ptr) ((((ptr)[8]) << 8) + ptr[9]) 616594783dSgdamore #define EDID_MANFID_0(x) ((((x) >> 10) & 0x1f) + '@') 626594783dSgdamore #define EDID_MANFID_1(x) ((((x) >> 5) & 0x1f) + '@') 636594783dSgdamore #define EDID_MANFID_2(x) ((((x) >> 0) & 0x1f) + '@') 646594783dSgdamore 656594783dSgdamore /* relative to edid block */ 666594783dSgdamore #define EDID_PRODUCT_ID(ptr) (((ptr)[10]) | (((ptr)[11]) << 8)) 676594783dSgdamore #define EDID_SERIAL_NUMBER(ptr) (((ptr)[12] << 24) + \ 686594783dSgdamore ((ptr)[13] << 16) + \ 696594783dSgdamore ((ptr)[14] << 8) + \ 706594783dSgdamore (ptr)[15]) 716594783dSgdamore 726594783dSgdamore /* relative to edid block */ 736594783dSgdamore #define EDID_WEEK(ptr) ((ptr)[16]) 746594783dSgdamore #define EDID_YEAR(ptr) (((ptr)[17]) + 1990) 756594783dSgdamore 766594783dSgdamore #define EDID_VERSION(ptr) ((ptr)[18]) 776594783dSgdamore #define EDID_REVISION(ptr) ((ptr)[19]) 786594783dSgdamore 796594783dSgdamore #define EDID_VIDEO_INPUT(ptr) ((ptr)[20]) 806594783dSgdamore #define EDID_VIDEO_INPUT_DIGITAL 0x80 816594783dSgdamore /* if INPUT_BIT_DIGITAL set */ 826594783dSgdamore #define EDID_VIDEO_INPUT_DFP1_COMPAT 0x01 836594783dSgdamore /* if INPUT_BIT_DIGITAL not set */ 846594783dSgdamore #define EDID_VIDEO_INPUT_BLANK_TO_BLACK 0x10 856594783dSgdamore #define EDID_VIDEO_INPUT_SEPARATE_SYNCS 0x08 866594783dSgdamore #define EDID_VIDEO_INPUT_COMPOSITE_SYNC 0x04 876594783dSgdamore #define EDID_VIDEO_INPUT_SYNC_ON_GRN 0x02 886594783dSgdamore #define EDID_VIDEO_INPUT_SERRATION 0x01 896594783dSgdamore #define EDID_VIDEO_INPUT_LEVEL(x) (((x) & 0x60) >> 5) 906594783dSgdamore /* meanings of level bits are as follows, I don't know names */ 916594783dSgdamore /* 0 = 0.7,0.3, 1 = 0.714,0.286, 2 = 1.0,0.4, 3 = 0.7,0.0 */ 926594783dSgdamore 936594783dSgdamore /* relative to edid block */ 946594783dSgdamore #define EDID_MAX_HSIZE(ptr) ((ptr)[21]) /* cm */ 956594783dSgdamore #define EDID_MAX_VSIZE(ptr) ((ptr)[22]) /* cm */ 966594783dSgdamore /* gamma is scaled by 100 (avoid fp), e.g. 213 == 2.13 */ 976594783dSgdamore #define _GAMMA(x) ((x) == 0xff ? 100 : ((x) + 100)) 986594783dSgdamore #define EDID_GAMMA(ptr) _GAMMA(ptr[23]) 996594783dSgdamore 1006594783dSgdamore #define EDID_FEATURES(ptr) ((ptr)[24]) 1016594783dSgdamore #define EDID_FEATURES_STANDBY 0x80 1026594783dSgdamore #define EDID_FEATURES_SUSPEND 0x40 1036594783dSgdamore #define EDID_FEATURES_ACTIVE_OFF 0x20 1046594783dSgdamore #define EDID_FEATURES_DISP_TYPE(x) (((x) & 0x18) >> 3) 1056594783dSgdamore #define EDID_FEATURES_DISP_TYPE_MONO 0 1066594783dSgdamore #define EDID_FEATURES_DISP_TYPE_RGB 1 1076594783dSgdamore #define EDID_FEATURES_DISP_TYPE_NON_RGB 2 1086594783dSgdamore #define EDID_FEATURES_DISP_TYPE_UNDEFINED 3 1096594783dSgdamore #define EDID_FEATURES_STD_COLOR 0x04 1106594783dSgdamore #define EDID_FEATURES_PREFERRED_TIMING 0x02 1116594783dSgdamore #define EDID_FEATURES_DEFAULT_GTF 0x01 1126594783dSgdamore 1136594783dSgdamore /* chroma values 0.0 - 0.999 scaled as 0-999 */ 1146594783dSgdamore #define _CHLO(byt, shft) (((byt) >> (shft)) & 0x3) 1156594783dSgdamore #define _CHHI(byt) ((byt) << 2) 1166594783dSgdamore #define _CHHILO(ptr, l, s, h) (_CHLO((ptr)[l], s) | _CHHI((ptr)[h])) 1176594783dSgdamore #define _CHROMA(ptr, l, s, h) ((_CHHILO(ptr, l, s, h) * 1000) / 1024) 1186594783dSgdamore 1196594783dSgdamore #define EDID_CHROMA_REDX(ptr) (_CHROMA(ptr, 25, 6, 27)) 1206594783dSgdamore #define EDID_CHROMA_REDY(ptr) (_CHROMA(ptr, 25, 4, 28)) 1216594783dSgdamore #define EDID_CHROMA_GREENX(ptr) (_CHROMA(ptr, 25, 2, 29)) 1226594783dSgdamore #define EDID_CHROMA_GREENY(ptr) (_CHROMA(ptr, 25, 0, 30)) 1236594783dSgdamore #define EDID_CHROMA_BLUEX(ptr) (_CHROMA(ptr, 26, 6, 31)) 1246594783dSgdamore #define EDID_CHROMA_BLUEY(ptr) (_CHROMA(ptr, 26, 4, 32)) 1256594783dSgdamore #define EDID_CHROMA_WHITEX(ptr) (_CHROMA(ptr, 26, 2, 33)) 1266594783dSgdamore #define EDID_CHROMA_WHITEY(ptr) (_CHROMA(ptr, 26, 0, 34)) 1276594783dSgdamore 1286594783dSgdamore /* relative to edid block */ 129d92bd53fSgdamore #define EDID_EST_TIMING(ptr) (((ptr)[35] << 8) | (ptr)[36]) 1306594783dSgdamore #define EDID_EST_TIMING_720_400_70 0x8000 /* 720x400 @ 70Hz */ 1316594783dSgdamore #define EDID_EST_TIMING_720_400_88 0x4000 /* 720x400 @ 88Hz */ 1326594783dSgdamore #define EDID_EST_TIMING_640_480_60 0x2000 /* 640x480 @ 60Hz */ 1336594783dSgdamore #define EDID_EST_TIMING_640_480_67 0x1000 /* 640x480 @ 67Hz */ 1346594783dSgdamore #define EDID_EST_TIMING_640_480_72 0x0800 /* 640x480 @ 72Hz */ 1356594783dSgdamore #define EDID_EST_TIMING_640_480_75 0x0400 /* 640x480 @ 75Hz */ 1366594783dSgdamore #define EDID_EST_TIMING_800_600_56 0x0200 /* 800x600 @ 56Hz */ 1376594783dSgdamore #define EDID_EST_TIMING_800_600_60 0x0100 /* 800x600 @ 60Hz */ 1386594783dSgdamore #define EDID_EST_TIMING_800_600_72 0x0080 /* 800x600 @ 72Hz */ 1396594783dSgdamore #define EDID_EST_TIMING_800_600_75 0x0040 /* 800x600 @ 75Hz */ 1406594783dSgdamore #define EDID_EST_TIMING_832_624_75 0x0020 /* 832x624 @ 75Hz */ 1416594783dSgdamore #define EDID_EST_TIMING_1024_768_87I 0x0010 /* 1024x768i @ 87Hz */ 1426594783dSgdamore #define EDID_EST_TIMING_1024_768_60 0x0008 /* 1024x768 @ 60Hz */ 1436594783dSgdamore #define EDID_EST_TIMING_1024_768_70 0x0004 /* 1024x768 @ 70Hz */ 1446594783dSgdamore #define EDID_EST_TIMING_1024_768_75 0x0002 /* 1024x768 @ 75Hz */ 1456594783dSgdamore #define EDID_EST_TIMING_1280_1024_75 0x0001 /* 1280x1024 @ 75Hz */ 1466594783dSgdamore 1476594783dSgdamore /* 1486594783dSgdamore * N.B.: ptr is relative to standard timing block - used for standard timing 1496594783dSgdamore * descriptors as well as standard timings section of edid! 1506594783dSgdamore */ 1516594783dSgdamore #define EDID_STD_TIMING_HRES(ptr) ((((ptr)[0]) * 8) + 248) 1526594783dSgdamore #define EDID_STD_TIMING_VFREQ(ptr) ((((ptr)[1]) & 0x3f) + 60) 1536594783dSgdamore #define EDID_STD_TIMING_RATIO(ptr) ((ptr)[1] & 0xc0) 1546594783dSgdamore #define EDID_STD_TIMING_RATIO_16_10 0x00 1556594783dSgdamore #define EDID_STD_TIMING_RATIO_4_3 0x40 1566594783dSgdamore #define EDID_STD_TIMING_RATIO_5_4 0x80 1576594783dSgdamore #define EDID_STD_TIMING_RATIO_16_9 0xc0 1586594783dSgdamore 1596594783dSgdamore #define EDID_STD_TIMING_SIZE 16 1606594783dSgdamore #define EDID_STD_TIMING_COUNT 8 1616594783dSgdamore 1626594783dSgdamore /* 1636594783dSgdamore * N.B.: ptr is relative to descriptor block start 1646594783dSgdamore */ 1656594783dSgdamore #define EDID_BLOCK_SIZE 18 1666594783dSgdamore #define EDID_BLOCK_COUNT 4 1676594783dSgdamore 1686594783dSgdamore /* detailed timing block.... what a mess */ 1696594783dSgdamore #define EDID_BLOCK_IS_DET_TIMING(ptr) ((ptr)[0] | (ptr)[1]) 1706594783dSgdamore 1716594783dSgdamore #define EDID_DET_TIMING_DOT_CLOCK(ptr) (((ptr)[0] | ((ptr)[1] << 8)) * 10000) 1726594783dSgdamore #define _HACT_LO(ptr) ((ptr)[2]) 1736594783dSgdamore #define _HBLK_LO(ptr) ((ptr)[3]) 1746594783dSgdamore #define _HACT_HI(ptr) (((ptr)[4] & 0xf0) << 4) 1756594783dSgdamore #define _HBLK_HI(ptr) (((ptr)[4] & 0x0f) << 8) 1766594783dSgdamore #define EDID_DET_TIMING_HACTIVE(ptr) (_HACT_LO(ptr) | _HACT_HI(ptr)) 1776594783dSgdamore #define EDID_DET_TIMING_HBLANK(ptr) (_HBLK_LO(ptr) | _HBLK_HI(ptr)) 1786594783dSgdamore #define _VACT_LO(ptr) ((ptr)[5]) 1796594783dSgdamore #define _VBLK_LO(ptr) ((ptr)[6]) 1806594783dSgdamore #define _VACT_HI(ptr) (((ptr)[7] & 0xf0) << 4) 1816594783dSgdamore #define _VBLK_HI(ptr) (((ptr)[7] & 0x0f) << 8) 1826594783dSgdamore #define EDID_DET_TIMING_VACTIVE(ptr) (_VACT_LO(ptr) | _VACT_HI(ptr)) 1836594783dSgdamore #define EDID_DET_TIMING_VBLANK(ptr) (_VBLK_LO(ptr) | _VBLK_HI(ptr)) 1846594783dSgdamore #define _HOFF_LO(ptr) ((ptr)[8]) 1856594783dSgdamore #define _HWID_LO(ptr) ((ptr)[9]) 1866594783dSgdamore #define _VOFF_LO(ptr) ((ptr)[10] >> 4) 1876594783dSgdamore #define _VWID_LO(ptr) ((ptr)[10] & 0xf) 1886594783dSgdamore #define _HOFF_HI(ptr) (((ptr)[11] & 0xc0) << 2) 1896594783dSgdamore #define _HWID_HI(ptr) (((ptr)[11] & 0x30) << 4) 1906594783dSgdamore #define _VOFF_HI(ptr) (((ptr)[11] & 0x0c) << 2) 1916594783dSgdamore #define _VWID_HI(ptr) (((ptr)[11] & 0x03) << 4) 1926594783dSgdamore #define EDID_DET_TIMING_HSYNC_OFFSET(ptr) (_HOFF_LO(ptr) | _HOFF_HI(ptr)) 1936594783dSgdamore #define EDID_DET_TIMING_HSYNC_WIDTH(ptr) (_HWID_LO(ptr) | _HWID_HI(ptr)) 1946594783dSgdamore #define EDID_DET_TIMING_VSYNC_OFFSET(ptr) (_VOFF_LO(ptr) | _VOFF_HI(ptr)) 1956594783dSgdamore #define EDID_DET_TIMING_VSYNC_WIDTH(ptr) (_VWID_LO(ptr) | _VWID_HI(ptr)) 1966594783dSgdamore #define _HSZ_LO(ptr) ((ptr)[12]) 1976594783dSgdamore #define _VSZ_LO(ptr) ((ptr)[13]) 1986594783dSgdamore #define _HSZ_HI(ptr) (((ptr)[14] & 0xf0) << 4) 1996594783dSgdamore #define _VSZ_HI(ptr) (((ptr)[14] & 0x0f) << 8) 2006594783dSgdamore #define EDID_DET_TIMING_HSIZE(ptr) (_HSZ_LO(ptr) | _HSZ_HI(ptr)) 2016594783dSgdamore #define EDID_DET_TIMING_VSIZE(ptr) (_VSZ_LO(ptr) | _VSZ_HI(ptr)) 2026594783dSgdamore #define EDID_DET_TIMING_HBORDER(ptr) ((ptr)[15]) 2036594783dSgdamore #define EDID_DET_TIMING_VBORDER(ptr) ((ptr)[16]) 2046594783dSgdamore #define EDID_DET_TIMING_FLAGS(ptr) ((ptr)[17]) 2056594783dSgdamore #define EDID_DET_TIMING_FLAG_INTERLACE 0x80 20622fb3929Sjdc #define EDID_DET_TIMING_FLAG_STEREO 0x60 /* stereo or not */ 2076594783dSgdamore #define EDID_DET_TIMING_FLAG_SYNC_SEPARATE 0x18 20822fb3929Sjdc #define EDID_DET_TIMING_FLAG_VSYNC_POSITIVE 0x04 20922fb3929Sjdc #define EDID_DET_TIMING_FLAG_HSYNC_POSITIVE 0x02 21022fb3929Sjdc #define EDID_DET_TIMING_FLAG_STEREO_MODE 0x01 /* stereo mode */ 2116594783dSgdamore 2126594783dSgdamore 2136594783dSgdamore /* N.B.: these tests assume that we already checked for detailed timing! */ 2146594783dSgdamore #define EDID_BLOCK_TYPE(ptr) ((ptr)[3]) 2156594783dSgdamore 2166594783dSgdamore #define EDID_DESC_BLOCK_SIZE 18 2176594783dSgdamore #define EDID_DESC_BLOCK_TYPE_SERIAL 0xFF 2186594783dSgdamore #define EDID_DESC_BLOCK_TYPE_ASCII 0xFE 2196594783dSgdamore #define EDID_DESC_BLOCK_TYPE_RANGE 0xFD 2206594783dSgdamore #define EDID_DESC_BLOCK_TYPE_NAME 0xFC 2216594783dSgdamore #define EDID_DESC_BLOCK_TYPE_COLOR_POINT 0xFB 2226594783dSgdamore #define EDID_DESC_BLOCK_TYPE_STD_TIMING 0xFA 2236594783dSgdamore 2246594783dSgdamore /* used for descriptors 0xFF, 0xFE, and 0xFC */ 2256594783dSgdamore #define EDID_DESC_ASCII_DATA_OFFSET 5 2266594783dSgdamore #define EDID_DESC_ASCII_DATA_LEN 13 2276594783dSgdamore 2286594783dSgdamore #define EDID_DESC_RANGE_MIN_VFREQ(ptr) ((ptr)[5]) /* Hz */ 2296594783dSgdamore #define EDID_DESC_RANGE_MAX_VFREQ(ptr) ((ptr)[6]) /* Hz */ 2306594783dSgdamore #define EDID_DESC_RANGE_MIN_HFREQ(ptr) ((ptr)[7]) /* kHz */ 2316594783dSgdamore #define EDID_DESC_RANGE_MAX_HFREQ(ptr) ((ptr)[8]) /* kHz */ 2326594783dSgdamore #define EDID_DESC_RANGE_MAX_CLOCK(ptr) (((ptr)[9]) * 10) /* MHz */ 2336594783dSgdamore #define EDID_DESC_RANGE_HAVE_GTF2(ptr) (((ptr)[10]) == 0x02) 2346594783dSgdamore #define EDID_DESC_RANGE_GTF2_HFREQ(ptr) (((ptr)[12]) * 2) 2356594783dSgdamore #define EDID_DESC_RANGE_GTF2_C(ptr) (((ptr)[13]) / 2) 2366594783dSgdamore #define EDID_DESC_RANGE_GTF2_M(ptr) ((ptr)[14] + ((ptr)[15] << 8)) 2376594783dSgdamore #define EDID_DESC_RANGE_GTF2_K(ptr) ((ptr)[16]) 2386594783dSgdamore #define EDID_DESC_RANGE_GTF2_J(ptr) ((ptr)[17] / 2) 2396594783dSgdamore 2406594783dSgdamore #define EDID_DESC_COLOR_WHITEX(ptr) 2416594783dSgdamore #define EDID_DESC_COLOR_WHITE_INDEX_1(ptr) ((ptr)[5]) 2426594783dSgdamore #define EDID_DESC_COLOR_WHITEX_1(ptr) _CHROMA(ptr, 6, 2, 7) 2436594783dSgdamore #define EDID_DESC_COLOR_WHITEY_1(ptr) _CHROMA(ptr, 6, 0, 8) 2446594783dSgdamore #define EDID_DESC_COLOR_GAMMA_1(ptr) _GAMMA(ptr[9]) 2456594783dSgdamore #define EDID_DESC_COLOR_WHITE_INDEX_2(ptr) ((ptr)[10]) 2466594783dSgdamore #define EDID_DESC_COLOR_WHITEX_2(ptr) _CHROMA(ptr, 11, 2, 12) 2476594783dSgdamore #define EDID_DESC_COLOR_WHITEY_2(ptr) _CHROMA(ptr, 11, 0, 13) 2486594783dSgdamore #define EDID_DESC_COLOR_GAMMA_2(ptr) _GAMMA(ptr[14]) 2496594783dSgdamore 2506594783dSgdamore #define EDID_DESC_STD_TIMING_START 5 2516594783dSgdamore #define EDID_DESC_STD_TIMING_COUNT 6 2526594783dSgdamore 253*3f50a23cSjmcneill #define EDID_EXT_BLOCK_COUNT(ptr) ((ptr)[126]) 254*3f50a23cSjmcneill 2556594783dSgdamore #endif /* _DEV_VIDEOMODE_EDIDREG_H */ 256