diff --git a/headers/private/graphics/common/edid.h b/headers/private/graphics/common/edid.h index 5938f1aad1..580a893750 100644 --- a/headers/private/graphics/common/edid.h +++ b/headers/private/graphics/common/edid.h @@ -25,18 +25,30 @@ typedef struct { uint8 revision; } edid1_version; +// analog input parameters +typedef struct { + uint8 input_voltage; // 0=0.7V/0.3V, 1=0.714V/0.286, + // 2=1V/0.4V, 3=0.7V/0V + bool setup; // true if voltage configurable + bool sep_sync; + bool comp_sync; + bool sync_on_green; + bool sync_serr; +} edid1_analog_params; + + +// digital input parameters +typedef struct { + uint8 bit_depth; + uint8 interface; +} edid1_digital_params; + // display info typedef struct { - BBITFIELD8_7 ( - input_type : 1, // 1 : digital - input_voltage : 2, // 0=0.7V/0.3V, 1=0.714V/0.286, - // 2=1V/0.4V, 3=0.7V/0V - setup : 1, // true if voltage configurable - sep_sync : 1, - comp_sync : 1, - sync_on_green : 1, - sync_serr : 1 - ); + uint8 input_type; + edid1_analog_params analog_params; + edid1_digital_params digital_params; + uint8 h_size; uint8 v_size; uint8 gamma; // (x+100)/100 diff --git a/headers/private/graphics/common/edid_raw.h b/headers/private/graphics/common/edid_raw.h index ee553a7a1c..fb32b44d82 100644 --- a/headers/private/graphics/common/edid_raw.h +++ b/headers/private/graphics/common/edid_raw.h @@ -61,11 +61,11 @@ typedef struct _PACKED { } edid1_version_raw; -// display info +// analog input parameters typedef struct _PACKED { - BBITFIELD8_7 ( - input_type : 1, // 1 : digital - input_voltage : 2, // 0=0.7V/0.3V, 1=0.714V/0.286, + BBITFIELD8_7 ( + input_type : 1, // 0 : analog, 1 : digital + input_voltage : 2, // 0=0.7V/0.3V, 1=0.714V/0.286, // 2=1V/0.4V, 3=0.7V/0V setup : 1, // true if voltage configurable sep_sync : 1, @@ -73,6 +73,26 @@ typedef struct _PACKED { sync_on_green : 1, sync_serr : 1 ); +} edid1_analog_params_raw; + + +// digital input parameters +typedef struct _PACKED { + BBITFIELD8_3 ( + input_type : 1, // 0 : analog, 1 : digital + bit_depth : 3, // 0=undefined, 1=6,2=8,3=10,4=12,5=14,6=16,7=reserved + interface : 4 // 0=undefined, 2=HDMIa, 3=HDMIb + // 4=MDDI, 5=DisplayPort + ); +} edid1_digital_params_raw; + + +// display info +typedef struct _PACKED { + union { + edid1_analog_params_raw analog_params; + edid1_digital_params_raw digital_params; + }; uint8 h_size; uint8 v_size; uint8 gamma; // (x+100)/100 diff --git a/src/add-ons/accelerants/common/decode_edid.c b/src/add-ons/accelerants/common/decode_edid.c index 08d89ccc7b..e029664b86 100644 --- a/src/add-ons/accelerants/common/decode_edid.c +++ b/src/add-ons/accelerants/common/decode_edid.c @@ -43,20 +43,33 @@ static void decode_version(edid1_version *version, const edid1_version_raw *raw) { version->version = raw->version; - version->revision = raw->revision; + version->revision = raw->revision; } static void decode_display(edid1_display *display, const edid1_display_raw *raw) -{ - display->input_type = raw->input_type; - display->input_voltage = raw->input_voltage; - display->setup = raw->setup; - display->sep_sync = raw->sep_sync; - display->comp_sync = raw->comp_sync; - display->sync_on_green = raw->sync_on_green; - display->sync_serr = raw->sync_serr; +{ + // We need to dig into one of the union to get the first + // bit which should always align. then we can pick the right + // data structure to parse. + display->input_type = raw->analog_params.input_type; + + if (display->input_type != 0) { + // digital + display->digital_params.bit_depth = 0; + if (raw->digital_params.bit_depth > 0 && raw->digital_params.bit_depth < 7) + display->digital_params.bit_depth = raw->digital_params.bit_depth * 2 + 4; + display->digital_params.interface = raw->digital_params.interface; + } else { + // analog + display->analog_params.input_voltage = raw->analog_params.input_voltage; + display->analog_params.setup = raw->analog_params.setup; + display->analog_params.sep_sync = raw->analog_params.sep_sync; + display->analog_params.comp_sync = raw->analog_params.comp_sync; + display->analog_params.sync_on_green = raw->analog_params.sync_on_green; + display->analog_params.sync_serr = raw->analog_params.sync_serr; + } display->h_size = raw->h_size; display->v_size = raw->v_size; diff --git a/src/add-ons/accelerants/common/dump_edid.c b/src/add-ons/accelerants/common/dump_edid.c index 287e5dde82..b85bbab874 100644 --- a/src/add-ons/accelerants/common/dump_edid.c +++ b/src/add-ons/accelerants/common/dump_edid.c @@ -4,12 +4,6 @@ */ -/*! - Part of DDC driver - Dumps EDID content -*/ - - #include "edid.h" #if !defined(_KERNEL_MODE) && !defined(_BOOT_MODE) # include "ddc_int.h" @@ -23,20 +17,23 @@ edid_dump(edid1_info *edid) { int i, j; - dprintf("Vendor: %s\n", edid->vendor.manufacturer); - dprintf("Product ID: %d\n", (int)edid->vendor.prod_id); - dprintf("Serial #: %d\n", (int)edid->vendor.serial); - dprintf("Produced in week/year: %d/%d\n", edid->vendor.week, + dprintf("EDID info:\n"); + dprintf(" Vendor: %s\n", edid->vendor.manufacturer); + dprintf(" Product ID: %d\n", (int)edid->vendor.prod_id); + dprintf(" Serial #: %d\n", (int)edid->vendor.serial); + dprintf(" Produced in week/year: %d/%d\n", edid->vendor.week, edid->vendor.year); - dprintf("EDID version: %d.%d\n", edid->version.version, + dprintf(" EDID version: %d.%d\n", edid->version.version, edid->version.revision); - dprintf("Type: %s\n", edid->display.input_type ? "Digital" : "Analog"); - dprintf("Size: %d cm x %d cm\n", edid->display.h_size, + dprintf(" Type: %s\n", edid->display.input_type != 0 ? "Digital" : "Analog"); + if (edid->display.input_type != 0) + dprintf(" Digtial Bit Depth: %d\n", edid->display.digital_params.bit_depth); + dprintf(" Size: %d cm x %d cm\n", edid->display.h_size, edid->display.v_size); - dprintf("Gamma=%.3f\n", (edid->display.gamma + 100) / 100.0); - dprintf("White (X,Y)=(%.3f,%.3f)\n", edid->display.white_x / 1024.0, + dprintf(" Gamma=%.3f\n", (edid->display.gamma + 100) / 100.0); + dprintf(" White (X,Y)=(%.3f,%.3f)\n", edid->display.white_x / 1024.0, edid->display.white_y / 1024.0); dprintf("Supported Future Video Modes:\n");