| 1 | |
| 2 | /* xf86DDC.h |
| 3 | * |
| 4 | * This file contains all information to interpret a standard EDIC block |
| 5 | * transmitted by a display device via DDC (Display Data Channel). So far |
| 6 | * there is no information to deal with optional EDID blocks. |
| 7 | * DDC is a Trademark of VESA (Video Electronics Standard Association). |
| 8 | * |
| 9 | * Copyright 1998 by Egbert Eich <Egbert.Eich@Physik.TU-Darmstadt.DE> |
| 10 | */ |
| 11 | |
| 12 | #ifndef XF86_DDC_H |
| 13 | #define XF86_DDC_H |
| 14 | |
| 15 | #include "edid.h" |
| 16 | #include "xf86i2c.h" |
| 17 | #include "xf86str.h" |
| 18 | |
| 19 | /* speed up / slow down */ |
| 20 | typedef enum { |
| 21 | DDC_SLOW, |
| 22 | DDC_FAST |
| 23 | } xf86ddcSpeed; |
| 24 | |
| 25 | typedef void (*DDC1SetSpeedProc) (ScrnInfoPtr, xf86ddcSpeed); |
| 26 | |
| 27 | extern _X_EXPORT xf86MonPtr xf86DoEDID_DDC1(ScrnInfoPtr pScrn, |
| 28 | DDC1SetSpeedProc DDC1SetSpeed, |
| 29 | unsigned |
| 30 | int (*DDC1Read) (ScrnInfoPtr) |
| 31 | ); |
| 32 | |
| 33 | extern _X_EXPORT xf86MonPtr xf86DoEDID_DDC2(ScrnInfoPtr pScrn, I2CBusPtr pBus); |
| 34 | |
| 35 | extern _X_EXPORT xf86MonPtr xf86DoEEDID(ScrnInfoPtr pScrn, I2CBusPtr pBus, Bool); |
| 36 | |
| 37 | extern _X_EXPORT xf86MonPtr xf86PrintEDID(xf86MonPtr monPtr); |
| 38 | |
| 39 | extern _X_EXPORT xf86MonPtr xf86InterpretEDID(int screenIndex, Uchar * block); |
| 40 | |
| 41 | extern _X_EXPORT xf86MonPtr xf86InterpretEEDID(int screenIndex, Uchar * block); |
| 42 | |
| 43 | extern _X_EXPORT void |
| 44 | xf86EdidMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC); |
| 45 | |
| 46 | extern _X_EXPORT Bool xf86SetDDCproperties(ScrnInfoPtr pScreen, xf86MonPtr DDC); |
| 47 | |
| 48 | extern _X_EXPORT Bool |
| 49 | xf86MonitorIsHDMI(xf86MonPtr mon); |
| 50 | |
| 51 | extern _X_EXPORT xf86MonPtr xf86DoDisplayID(ScrnInfoPtr pScrn, I2CBusPtr pBus); |
| 52 | |
| 53 | extern _X_EXPORT void |
| 54 | xf86DisplayIDMonitorSet(int scrnIndex, MonPtr mon, xf86MonPtr DDC); |
| 55 | |
| 56 | extern _X_EXPORT DisplayModePtr |
| 57 | FindDMTMode(int hsize, int vsize, int refresh, Bool rb); |
| 58 | |
| 59 | extern _X_EXPORT const DisplayModeRec DMTModes[]; |
| 60 | |
| 61 | /* |
| 62 | * Quirks to work around broken EDID data from various monitors. |
| 63 | */ |
| 64 | typedef enum { |
| 65 | DDC_QUIRK_NONE = 0, |
| 66 | /* First detailed mode is bogus, prefer largest mode at 60hz */ |
| 67 | DDC_QUIRK_PREFER_LARGE_60 = 1 << 0, |
| 68 | /* 135MHz clock is too high, drop a bit */ |
| 69 | DDC_QUIRK_135_CLOCK_TOO_HIGH = 1 << 1, |
| 70 | /* Prefer the largest mode at 75 Hz */ |
| 71 | DDC_QUIRK_PREFER_LARGE_75 = 1 << 2, |
| 72 | /* Convert detailed timing's horizontal from units of cm to mm */ |
| 73 | DDC_QUIRK_DETAILED_H_IN_CM = 1 << 3, |
| 74 | /* Convert detailed timing's vertical from units of cm to mm */ |
| 75 | DDC_QUIRK_DETAILED_V_IN_CM = 1 << 4, |
| 76 | /* Detailed timing descriptors have bogus size values, so just take the |
| 77 | * maximum size and use that. |
| 78 | */ |
| 79 | DDC_QUIRK_DETAILED_USE_MAXIMUM_SIZE = 1 << 5, |
| 80 | /* Monitor forgot to set the first detailed is preferred bit. */ |
| 81 | DDC_QUIRK_FIRST_DETAILED_PREFERRED = 1 << 6, |
| 82 | /* use +hsync +vsync for detailed mode */ |
| 83 | DDC_QUIRK_DETAILED_SYNC_PP = 1 << 7, |
| 84 | /* Force single-link DVI bandwidth limit */ |
| 85 | DDC_QUIRK_DVI_SINGLE_LINK = 1 << 8, |
| 86 | } ddc_quirk_t; |
| 87 | |
| 88 | typedef void (*handle_detailed_fn) (struct detailed_monitor_section *, void *); |
| 89 | |
| 90 | void xf86ForEachDetailedBlock(xf86MonPtr mon, handle_detailed_fn, void *data); |
| 91 | |
| 92 | ddc_quirk_t xf86DDCDetectQuirks(int scrnIndex, xf86MonPtr DDC, Bool verbose); |
| 93 | |
| 94 | void xf86DetTimingApplyQuirks(struct detailed_monitor_section *det_mon, |
| 95 | ddc_quirk_t quirks, int hsize, int vsize); |
| 96 | |
| 97 | typedef void (*handle_video_fn) (struct cea_video_block *, void *); |
| 98 | |
| 99 | void xf86ForEachVideoBlock(xf86MonPtr, handle_video_fn, void *); |
| 100 | |
| 101 | #endif |