Add xf86MonitorIsHDMI() helper.

This commit is contained in:
Adam Jackson 2008-11-03 12:50:28 -05:00
parent a7951a4dad
commit 4cf2f4172a
3 changed files with 57 additions and 2 deletions

View File

@ -459,3 +459,56 @@ validate_version(int scrnIndex, struct edid_version *r)
return TRUE; return TRUE;
} }
/*
* Returns true if HDMI, false if definitely not or unknown.
*/
_X_EXPORT Bool
xf86MonitorIsHDMI(xf86MonPtr mon)
{
int i = 0, version, offset;
char *edid = NULL;
if (!mon)
return FALSE;
if (!(mon->flags & EDID_COMPLETE_RAWDATA))
return FALSE;
if (!mon->no_sections)
return FALSE;
edid = (char *)mon->rawData;
if (!edid)
return FALSE;
/* find the CEA extension block */
for (i = 1; i <= mon->no_sections; i++)
if (edid[i * 128] == 0x02)
break;
if (i == mon->no_sections + 1)
return FALSE;
edid += (i * 128);
version = edid[1];
offset = edid[2];
if (version < 3 || offset < 4)
return FALSE;
/* walk the cea data blocks */
for (i = 4; i < offset; i += (edid[i] & 0x1f) + 1) {
char *x = edid + i;
/* find a vendor specific block */
if ((x[0] & 0xe0) >> 5 == 0x03) {
int oui = (x[3] << 16) + (x[2] << 8) + x[1];
/* find the HDMI vendor OUI */
if (oui == 0x000c03)
return TRUE;
}
}
/* guess it's not HDMI after all */
return FALSE;
}

View File

@ -59,6 +59,7 @@ extern Bool xf86SetDDCproperties(
DisplayModePtr xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC); DisplayModePtr xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC);
extern Bool
xf86MonitorIsHDMI(xf86MonPtr mon);
#endif #endif

View File

@ -922,6 +922,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
SYMFUNC(xf86DoEEDID) SYMFUNC(xf86DoEEDID)
SYMFUNC(xf86DDCMonitorSet) SYMFUNC(xf86DDCMonitorSet)
SYMFUNC(xf86SetDDCproperties) SYMFUNC(xf86SetDDCproperties)
SYMFUNC(xf86MonitorIsHDMI)
SYMFUNC(xf86CreateI2CBusRec) SYMFUNC(xf86CreateI2CBusRec)
SYMFUNC(xf86CreateI2CDevRec) SYMFUNC(xf86CreateI2CDevRec)