Exemplo n.º 1
0
static int
decode_descriptors (const uchar *edid, MonitorInfo *info)
{
    int i;
    int timing_idx;

    timing_idx = 0;

    for (i = 0; i < 4; ++i)
    {
	int index = 0x36 + i * 18;

	if (edid[index + 0] == 0x00 && edid[index + 1] == 0x00)
	{
	    decode_display_descriptor (edid + index, info);
	}
	else
	{
	    decode_detailed_timing (
		edid + index, &(info->detailed_timings[timing_idx++]));
	}
    }

    info->n_detailed_timings = timing_idx;

    return TRUE;
}
Exemplo n.º 2
0
static void
decode_detailed_monitor(edid1_detailed_monitor *monitor,
	const edid1_detailed_monitor_raw *raw, bool enableExtra)
{
	int i, j;

	for (i = 0; i < EDID1_NUM_DETAILED_MONITOR_DESC; ++i, ++monitor, ++raw) {

		// workaround: normally, all four bytes must be zero for detailed
		// description, but at least some Formac monitors violate that:
		// they have some additional info that start at zero_4(!),
		// so even if only the first two _or_ the other two bytes are
		// zero, we accept it as a monitor description block
		if (enableExtra
			&& ((raw->extra.zero_0[0] == 0 && raw->extra.zero_0[1] == 0)
				|| (raw->extra.zero_0[2] == 0 && raw->extra.zero_4 == 0))) {
			monitor->monitor_desc_type = raw->extra.monitor_desc_type;

			switch (raw->extra.monitor_desc_type) {
				case EDID1_SERIAL_NUMBER:
					copy_str(monitor->data.serial_number, 
						raw->extra.data.serial_number, EDID1_EXTRA_STRING_LEN);
					break;

				case EDID1_ASCII_DATA:
					copy_str(monitor->data.ascii_data, 
						raw->extra.data.ascii_data, EDID1_EXTRA_STRING_LEN);
					break;

				case EDID1_MONITOR_RANGES:
					monitor->data.monitor_range = raw->extra.data.monitor_range;
					break;

				case EDID1_MONITOR_NAME:
					copy_str(monitor->data.monitor_name, 
						raw->extra.data.monitor_name, EDID1_EXTRA_STRING_LEN);
					break;

				case EDID1_ADD_COLOUR_POINTER:
					decode_whitepoint(monitor->data.whitepoint, 
						&raw->extra.data.whitepoint);
					break;

				case EDID1_ADD_STD_TIMING:
					for (j = 0; j < EDID1_NUM_EXTRA_STD_TIMING; ++j) {
						decode_std_timing(&monitor->data.std_timing[j],
							&raw->extra.data.std_timing[j]);
					}
					break;
			}
		} else if (raw->detailed_timing.pixel_clock > 0) {
			monitor->monitor_desc_type = EDID1_IS_DETAILED_TIMING;
			decode_detailed_timing(&monitor->data.detailed_timing,
				&raw->detailed_timing);
		}
	}
}