From 44b14682d6ce87b21a7418bfaf5e99b039840588 Mon Sep 17 00:00:00 2001 From: Maximilian Stiefel Date: Tue, 23 Jun 2020 17:07:15 +0200 Subject: [PATCH] Detailed timings descriptor finished --- edid_stockach.json | 63 +++++++++ main | Bin 53640 -> 0 bytes main.c | 309 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 364 insertions(+), 8 deletions(-) delete mode 100755 main diff --git a/edid_stockach.json b/edid_stockach.json index 5860682..9856eb6 100644 --- a/edid_stockach.json +++ b/edid_stockach.json @@ -64,5 +64,68 @@ "m1024_768_75": true, "m1280_1024_75": true, "m1152_870_75": true + }, + "timings": [ + { + "x_resolution": 1680, + "aspect_ratio": "16:10", + "vertical_frequency": 60 + }, + { + "x_resolution": 1280, + "aspect_ratio": "5:4", + "vertical_frequency": 60 + }, + { + "x_resolution": 1440, + "aspect_ratio": "16:10", + "vertical_frequency": 60 + }, + { + "x_resolution": 1152, + "aspect_ratio": "4:3", + "vertical_frequency": 75 + }, + { + "x_resolution": 1600, + "aspect_ratio": "16:9", + "vertical_frequency": 60 + }, + { + "x_resolution": 1280, + "aspect_ratio": "16:10", + "vertical_frequency": 60 + }, + { + "x_resolution": 1280, + "aspect_ratio": "16:9", + "vertical_frequency": 60 + }, + { + "x_resolution": 1400, + "aspect_ratio": "4:3", + "vertical_frequency": 60 + } + ], + "detailed_timing_descriptor": { + "pixel_clock_mhz": 148.5, + "horizontal_active_pixels": 1920, + "horizontal_blanking_pixels": 280, + "vertical_active_lines": 1080, + "vertical_blanking_lines": 45, + "horizontal_front_porch_pixels": 88, + "horizontal_sync_pulse_pixels": 44, + "vertical_front_porch_lines": 4, + "vertical_sync_pulse_lines": 5, + "horizontal_image_size_mm": 521, + "vertical_image_size_mm": 293, + "horizontal_border_pixels": 0, + "vertical_border_lines": 0, + "stereo_mode": "none", + "interlaced": false, + "digital_seperate_sync": { + "vertical_sync_serration": true, + "horizontal_sync_polarity": "positive" + } } } diff --git a/main b/main deleted file mode 100755 index 2c9646fd6aee99ff1795b9b6e035a58d0677f4f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53640 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 0; i++) { + // t.type == JSON_TYPE_OBJECT + // X resolution + json_scanf(multi_use_token.ptr, multi_use_token.len, "{x_resolution: %f}", &multi_use_flt); + edid->timings[i].x_resolution = stp_round(multi_use_flt/8-31); + printf("res> %f\n", multi_use_flt); + // Aspect ratio + json_scanf(multi_use_token.ptr, multi_use_token.len, "{aspect_ratio: %Q}", &multi_use_str); + if (strcmp(multi_use_str, "16:10") == 0) { + edid->timings[i].aspect_ratio = 0x3 & EDID_ASPECT_RATIO_16_10; + } else if (strcmp(multi_use_str, "4:3") == 0) { + edid->timings[i].aspect_ratio = 0x3 & EDID_ASPECT_RATIO_4_3; + } else if (strcmp(multi_use_str, "5:4") == 0) { + edid->timings[i].aspect_ratio = 0x3 & EDID_ASPECT_RATIO_5_4; + } else if (strcmp(multi_use_str, "16:9") == 0) { + edid->timings[i].aspect_ratio = 0x3 & EDID_ASPECT_RATIO_16_9; + } else { + printf("Error: Aspect ratio not supported"); + return 1; + } + // Free string that has been allocated in memory + free(multi_use_str); + // Vertical frequency + json_scanf(multi_use_token.ptr, multi_use_token.len, "{vertical_frequency: %d}", &multi_use_int); + if (multi_use_int >= 60) { + edid->timings[i].vertical_frequency = multi_use_int-60; + } else { + printf("Error: Vertical frequency cannot be lower than 60 Hz.\n"); + return 1; + } + } + } else { + printf("Error: One of either edid or json_str is NULL.\n"); + return 1; + } + return 0; +} + +static int generate_detailed_timing_descriptor( + edid_t* edid, + unsigned char* json_str, + size_t json_len) +{ + unsigned int multi_use_int; + float multi_use_float; + struct json_token multi_use_token; + bool multi_use_bool; + char* multi_use_str; + + if (edid && json_str) { + // Pixel clock + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {pixel_clock_mhz: %f}}", + &multi_use_float); + /* The data is stored as 10 kHz unitsi in the EDID structure. + It is a float representing MHz in the JSON file. + */ + edid->detailed_timing_descriptor.pixel_clock = stp_round(multi_use_float/0.01f); + // Horizontal active pixels + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {horizontal_active_pixels: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .horizontal_active_pixels_lsbs = 0xFF & multi_use_int; + edid->detailed_timing_descriptor + .horizontal_active_pixels_msbs = 0x0F & (multi_use_int >> 8); + // Horizontal blanking pixels + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {horizontal_blanking_pixels: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .horizontal_blanking_pixels_lsbs = 0xFF & multi_use_int; + edid->detailed_timing_descriptor + .horizontal_blanking_pixels_msbs = 0x0F & (multi_use_int >> 8); + // Vertical active lines + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {vertical_active_lines: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .vertical_active_lines_lsbs = 0xFF & multi_use_int; + edid->detailed_timing_descriptor + .vertical_active_lines_msbs = 0x0F & (multi_use_int >> 8); + // Vertical blanking lines + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {vertical_blanking_lines: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .vertical_blanking_lines_lsbs = 0xFF & multi_use_int; + edid->detailed_timing_descriptor + .vertical_blanking_lines_msbs = 0x0F & (multi_use_int >> 8); + // Horizontal front porch pixels + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {horizontal_front_porch_pixels: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .horizontal_front_porch_pixels_lsbs = 0xFF & multi_use_int; + edid->detailed_timing_descriptor + .horizontal_front_porch_pixels_msbs = 0x03 & (multi_use_int >> 8); + // Horizontal sync pulse pixels + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {horizontal_sync_pulse_pixels: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .horizontal_sync_pulse_pixels_lsbs = 0xFF & multi_use_int; + edid->detailed_timing_descriptor + .horizontal_sync_pulse_pixels_msbs = 0x03 & (multi_use_int >> 8); + // Vertical front porch lines + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {vertical_front_porch_lines: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .vertical_front_porch_lines_lsbs = 0x0F & multi_use_int; + edid->detailed_timing_descriptor + .vertical_front_porch_lines_msbs = 0x03 & (multi_use_int >> 4); + // Vertical sync pulse lines + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {vertical_sync_pulse_lines: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .vertical_sync_pulse_lines_lsbs = 0x0F & multi_use_int; + edid->detailed_timing_descriptor + .vertical_sync_pulse_lines_msbs = 0x03 & (multi_use_int >> 4); + // Horizontal image size + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {horizontal_image_size_mm: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .horizontal_image_size_lsbs = 0xFF & multi_use_int; + edid->detailed_timing_descriptor + .horizontal_image_size_msbs = 0x0F & (multi_use_int >> 8); + // Vertical image size + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {vertical_image_size_mm: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .vertical_image_size_lsbs = 0xFF & multi_use_int; + edid->detailed_timing_descriptor + .vertical_image_size_msbs = 0x0F & (multi_use_int >> 8); + // Horizontal border pixels + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {horizontal_border_pixels: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .horizontal_border_pixels = 0xFF & multi_use_int; + // Vertical border lines + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {vertical_border_lines: %d}}", + &multi_use_int); + edid->detailed_timing_descriptor + .vertical_border_lines = 0xFF & multi_use_int; +#define PETER +#ifdef PETER + // Sync features bitmap + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {stereo_mode: %Q}}", + &multi_use_str); + if (strcmp(multi_use_str, "none") == 0) { + multi_use_int = 0; + } else { + printf("Error: This stereo mode is not implemented yet.\n"); + return 1; + } + free(multi_use_str); + edid->detailed_timing_descriptor + .features.digital_seperate.stereo_mode_lsb = 0x1 & multi_use_int; + edid->detailed_timing_descriptor + .features.digital_seperate.stereo_mode_msbs = 0x3 & (multi_use_int >> 1); + // Interlaced + json_scanf( json_str, json_len, + "{detailed_timing_descriptor: {interlaced: %B}}", + &multi_use_bool); + edid->detailed_timing_descriptor + .features.digital_seperate.interlaced = multi_use_bool; + // Sync details + if (json_scanf(json_str, json_len, + "{detailed_timing_descriptor: { digital_seperate_sync: %T}}", + &multi_use_token) > 0) { + // Set sync mode + edid->detailed_timing_descriptor + .features.digital_seperate.digital_seperate_sync = 0x3 & EDID_SYNC_MODE_DIGITAL_SEPERATE; + // Vertical sync serration + json_scanf( multi_use_token.ptr, multi_use_token.len, + "{vertical_sync_serration: %B}", + &multi_use_bool); + edid->detailed_timing_descriptor + .features.digital_seperate.vertical_sync_serration = multi_use_bool; + // Horizontal sync polarity + json_scanf( multi_use_token.ptr, multi_use_token.len, + "{horizontal_sync_polarity: %Q}", + &multi_use_str); + if (strcmp(multi_use_str, "positive") == 0) { + multi_use_bool = true; + } else if (strcmp(multi_use_str, "negative") == 0) { + multi_use_bool = false; + } else { + printf("Error: The horizontal sync polarity can either be positive or negative (JSON string).\n"); + return 1; + } + edid->detailed_timing_descriptor + .features.digital_seperate.horizontal_sync_polarity = multi_use_bool; + free(multi_use_str); + } else { + printf("Error: Could not parse JSON file somewhere arround sync \ + features in detailed timing descriptor.\n"); + return 1; + } +#endif + } else { + printf("Error: One of either edid or json_str is NULL.\n"); + return 1; + } + return 0; +} + int main(void) { //uint8_t edith[EDID_LENGTH]; @@ -575,12 +867,13 @@ int main(void) if (mystr) { printf("%s\n", mystr); printf("len> %d\n", len); - //free(mystr); } generate_header(&edith, mystr, len); generate_basic_display_parameters(&edith, mystr, len); generate_chromaticity_coordinates(&edith, mystr, len); generate_common_timing_modes(&edith, mystr, len); + generate_timings(&edith, mystr, len); + generate_detailed_timing_descriptor(&edith, mystr, len); disp_buf((uint8_t*)&edith, EDID_LENGTH); free(mystr); return 0;