cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * edid.h: defines to parse an EDID block
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * This file contains all information to interpret a standard EDIC block
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * transmitted by a display device via DDC (Display Data Channel). So far
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * there is no information to deal with optional EDID blocks.
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * DDC is a Trademark of VESA (Video Electronics Standard Association).
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * Copyright 1998 by Egbert Eich <Egbert.Eich@Physik.TU-Darmstadt.DE>
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* read complete EDID record */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* header: 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00 */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* vendor section */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define VENDOR_SECTION (HEADER_SECTION + HEADER_LENGTH)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* EDID version */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define VERSION_SECTION (VENDOR_SECTION + VENDOR_LENGTH)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* display information */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define DISPLAY_SECTION (VERSION_SECTION + VERSION_LENGTH)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* supported VESA and other standard timings */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define ESTABLISHED_TIMING_SECTION (DISPLAY_SECTION + DISPLAY_LENGTH)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* non predefined standard timings supported by display */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define STD_TIMING_SECTION (ESTABLISHED_TIMING_SECTION + E_TIMING_LENGTH)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define STD_TIMING_LENGTH (STD_TIMING_INFO_LEN * STD_TIMING_INFO_NUM)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* detailed timing info of non standard timings */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define DET_TIMING_SECTION (STD_TIMING_SECTION + STD_TIMING_LENGTH)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define DET_TIMING_LENGTH (DET_TIMING_INFO_LEN * DET_TIMING_INFO_NUM)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* number of EDID sections to follow */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define NO_EDID (DET_TIMING_SECTION + DET_TIMING_LENGTH)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* one byte checksum */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* extract information from vendor section */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _SERIAL_NO(x) x[0] + (x[1] << 8) + (x[2] << 16) + (x[3] << 24)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _L2(x) ((x[0] & 0x03) << 3) + ((x[1] & 0xE0) >> 5) + '@'
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* extract information from version section */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* extract information from display section */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define DIGITAL_INTERFACE _DIGITAL_INTERFACE(GET(D_INPUT))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _GAMMA(x) (x == 0xff ? 0.0 : ((x + 100.0)/100.0))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* color characteristics */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define REDX F_CC(I_CC((GET(D_RG_LOW)),(GET(D_REDX)),6))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define REDY F_CC(I_CC((GET(D_RG_LOW)),(GET(D_REDY)),4))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define GREENX F_CC(I_CC((GET(D_RG_LOW)),(GET(D_GREENX)),2))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define GREENY F_CC(I_CC((GET(D_RG_LOW)),(GET(D_GREENY)),0))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define BLUEX F_CC(I_CC((GET(D_BW_LOW)),(GET(D_BLUEX)),6))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define BLUEY F_CC(I_CC((GET(D_BW_LOW)),(GET(D_BLUEY)),4))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define WHITEX F_CC(I_CC((GET(D_BW_LOW)),(GET(D_WHITEX)),2))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define WHITEY F_CC(I_CC((GET(D_BW_LOW)),(GET(D_WHITEY)),0))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* extract information from standard timing section */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* extract information from estabished timing section */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _VALID_TIMING(x) !(((x[0] == 0x01) && (x[1] == 0x01)) \
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* EDID Ver. 1.3 redefined this */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync case RATIO1_1: y = ((v->version > 1 || v->revision > 2) \
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _NEXT_STD_TIMING(x) (x = (x + STD_TIMING_INFO_LEN))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* EDID Ver. >= 1.2 */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * Returns true if the pointer is the start of a monitor descriptor block
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * instead of a detailed timing descriptor.
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * Checking the reserved pad fields for zeroes fails on some monitors with
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * broken empty ASCII strings. Only the first two bytes are reliable.
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _IS_MONITOR_DESC(x) (x[0] == 0 && x[1] == 0)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _PIXEL_CLOCK(x) (x[0] + (x[1] << 8)) * 10000
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _H_SYNC_OFF(x) (x[8] + ((x[11] & 0xC0) << 2))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _H_SYNC_WIDTH(x) (x[9] + ((x[11] & 0x30) << 4))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _V_SYNC_OFF(x) ((x[10] >> 4) + ((x[11] & 0x0C) << 2))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _V_SYNC_WIDTH(x) ((x[10] & 0x0F) + ((x[11] & 0x03) << 4))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define MAX_CLOCK_KHZ (MAX_CLOCK * 10000) - (_MAX_CLOCK_KHZ(c) * 250)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _MAXWIDTH(x) ((x[13] == 0 ? 0 : x[13] + ((x[12] & 0x03) << 8)) * 8)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _SUPPORTED_BLANKING(x) ((x[15] & 0x18) >> 3)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define WHITEX F_CC(I_CC((GET(D_BW_LOW)),(GET(D_WHITEX)),2))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define WHITEY F_CC(I_CC((GET(D_BW_LOW)),(GET(D_WHITEY)),0))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _WHITEX_ADD(x,y) F_CC(I_CC(((*(x + y))),(*(x + y + 1)),2))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _WHITEY_ADD(x,y) F_CC(I_CC(((*(x + y))),(*(x + y + 2)),0))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define _NEXT_DT_MD_SECTION(x) (x = (x + DET_TIMING_INFO_LEN))
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#endif /* _PARSE_EDID_ */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* input type */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* input voltage level */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* Signal level setup */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* sync characteristics */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* DPMS features */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* display type, analog */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* display color encodings, digital */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* Msc stuff EDID Ver > 1.1 */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* detailed timing misc */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync /* 15 bit hole */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * Be careful when adding new sections; this structure can't grow, it's
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * embedded in the middle of xf86Monitor which is ABI. Sizes below are
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * in bytes, for ILP32 systems. If all else fails just copy the section
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * literally like serial and friends.
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync /* color management data */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync/* old, don't use */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * For DisplayID devices, only the scrnIndex, flags, and rawData fields
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync * are meaningful. For EDID, they all are.
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsynctypedef struct {
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define VENDOR_SUPPORT_DC_48bit(x) ( ( (x) >> 6) & 0x01)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define VENDOR_SUPPORT_DC_36bit(x) ( ( (x) >> 5) & 0x01)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define VENDOR_SUPPORT_DC_30bit(x) ( ( (x) >> 4) & 0x01)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define VENDOR_SUPPORT_DC_Y444(x) ( ( (x) >> 3) & 0x01)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#define VENDOR_LATENCY_PRESENT_I(x) ( ( (x) >> 6) & 0x01)
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync /* any other vendor blocks we know about */
cabde247f900dcf6e58d009bbdd15099c028c6fcvboxsync#endif /* _EDID_H_ */