Actually fetch all blocks of EEDID if asked to.
This commit is contained in:
parent
211e2bdcc6
commit
b4fbc31e10
|
@ -531,6 +531,9 @@ struct detailed_monitor_section {
|
||||||
} section; /* max: 80 */
|
} section; /* max: 80 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* flags */
|
||||||
|
#define EDID_COMPLETE_RAWDATA 0x1
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int scrnIndex;
|
int scrnIndex;
|
||||||
struct vendor vendor;
|
struct vendor vendor;
|
||||||
|
@ -539,7 +542,7 @@ typedef struct {
|
||||||
struct established_timings timings1;
|
struct established_timings timings1;
|
||||||
struct std_timings timings2[8];
|
struct std_timings timings2[8];
|
||||||
struct detailed_monitor_section det_mon[4];
|
struct detailed_monitor_section det_mon[4];
|
||||||
void *vdif; /* unused */
|
unsigned long flags;
|
||||||
int no_sections;
|
int no_sections;
|
||||||
Uchar *rawData;
|
Uchar *rawData;
|
||||||
} xf86Monitor, *xf86MonPtr;
|
} xf86Monitor, *xf86MonPtr;
|
||||||
|
|
|
@ -118,6 +118,20 @@ xf86InterpretEDID(int scrnIndex, Uchar *block)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xf86MonPtr
|
||||||
|
xf86InterpretEEDID(int scrnIndex, Uchar *block)
|
||||||
|
{
|
||||||
|
xf86MonPtr m;
|
||||||
|
|
||||||
|
m = xf86InterpretEDID(scrnIndex, block);
|
||||||
|
if (!m)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* extension parse */
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
get_vendor_section(Uchar *c, struct vendor *r)
|
get_vendor_section(Uchar *c, struct vendor *r)
|
||||||
{
|
{
|
||||||
|
|
|
@ -197,21 +197,17 @@ DDC2Read(I2CDevPtr dev, int block, unsigned char *R_Buffer)
|
||||||
* Attempts to probe the monitor for EDID information, if NoDDC and NoDDC2 are
|
* Attempts to probe the monitor for EDID information, if NoDDC and NoDDC2 are
|
||||||
* unset. EDID information blocks are interpreted and the results returned in
|
* unset. EDID information blocks are interpreted and the results returned in
|
||||||
* an xf86MonPtr. Unlike xf86DoEDID_DDC[12](), this function will return
|
* an xf86MonPtr. Unlike xf86DoEDID_DDC[12](), this function will return
|
||||||
* the complete EDID data, including all extension blocks.
|
* the complete EDID data, including all extension blocks, if the 'complete'
|
||||||
|
* parameter is TRUE;
|
||||||
*
|
*
|
||||||
* This function does not affect the list of modes used by drivers -- it is up
|
* This function does not affect the list of modes used by drivers -- it is up
|
||||||
* to the driver to decide policy on what to do with EDID information.
|
* to the driver to decide policy on what to do with EDID information.
|
||||||
*
|
*
|
||||||
* @return pointer to a new xf86MonPtr containing the EDID information.
|
* @return pointer to a new xf86MonPtr containing the EDID information.
|
||||||
* @return NULL if no monitor attached or failure to interpret the EDID.
|
* @return NULL if no monitor attached or failure to interpret the EDID.
|
||||||
*
|
|
||||||
* nblocks is an in/out parameter. If non-zero, it defines the number of
|
|
||||||
* blocks to read from the monitor; zero (or NULL pointer) means read all.
|
|
||||||
* If non-NULL, on return it will be filled in with the number of blocks
|
|
||||||
* read.
|
|
||||||
*/
|
*/
|
||||||
xf86MonPtr
|
xf86MonPtr
|
||||||
xf86DoEEDID(int scrnIndex, I2CBusPtr pBus, int *nblocks)
|
xf86DoEEDID(int scrnIndex, I2CBusPtr pBus, Bool complete)
|
||||||
{
|
{
|
||||||
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
||||||
unsigned char *EDID_block = NULL;
|
unsigned char *EDID_block = NULL;
|
||||||
|
@ -242,15 +238,20 @@ xf86DoEEDID(int scrnIndex, I2CBusPtr pBus, int *nblocks)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (DDC2Read(dev, 0, EDID_block)) {
|
if (DDC2Read(dev, 0, EDID_block)) {
|
||||||
tmp = xf86InterpretEDID(scrnIndex, EDID_block);
|
int i, n = EDID_block[0x7e];
|
||||||
|
|
||||||
|
if (complete && n) {
|
||||||
|
EDID_block = xrealloc(EDID_block, EDID1_LEN * (1+n));
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
DDC2Read(dev, i+1, EDID_block + (EDID1_LEN * (1+i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = xf86InterpretEEDID(scrnIndex, EDID_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nblocks) {
|
if (tmp && complete)
|
||||||
if (tmp)
|
tmp->flags |= EDID_COMPLETE_RAWDATA;
|
||||||
*nblocks = tmp->no_sections;
|
|
||||||
else
|
|
||||||
*nblocks = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
@ -269,8 +270,7 @@ xf86DoEEDID(int scrnIndex, I2CBusPtr pBus, int *nblocks)
|
||||||
xf86MonPtr
|
xf86MonPtr
|
||||||
xf86DoEDID_DDC2(int scrnIndex, I2CBusPtr pBus)
|
xf86DoEDID_DDC2(int scrnIndex, I2CBusPtr pBus)
|
||||||
{
|
{
|
||||||
int nblocks = 1;
|
return xf86DoEEDID(scrnIndex, pBus, FALSE);
|
||||||
return xf86DoEEDID(scrnIndex, pBus, &nblocks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -35,7 +35,7 @@ extern xf86MonPtr xf86DoEDID_DDC2(
|
||||||
I2CBusPtr pBus
|
I2CBusPtr pBus
|
||||||
);
|
);
|
||||||
|
|
||||||
extern xf86MonPtr xf86DoEEDID(int scrnIndex, I2CBusPtr pBus, int *nblocks);
|
extern xf86MonPtr xf86DoEEDID(int scrnIndex, I2CBusPtr pBus, Bool);
|
||||||
|
|
||||||
extern xf86MonPtr xf86PrintEDID(
|
extern xf86MonPtr xf86PrintEDID(
|
||||||
xf86MonPtr monPtr
|
xf86MonPtr monPtr
|
||||||
|
|
|
@ -1007,6 +1007,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
|
||||||
SYMFUNC(xf86DoEDID_DDC2)
|
SYMFUNC(xf86DoEDID_DDC2)
|
||||||
SYMFUNC(xf86InterpretEDID)
|
SYMFUNC(xf86InterpretEDID)
|
||||||
SYMFUNC(xf86PrintEDID)
|
SYMFUNC(xf86PrintEDID)
|
||||||
|
SYMFUNC(xf86DoEEDID)
|
||||||
SYMFUNC(xf86DDCMonitorSet)
|
SYMFUNC(xf86DDCMonitorSet)
|
||||||
SYMFUNC(xf86SetDDCproperties)
|
SYMFUNC(xf86SetDDCproperties)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue