From ba6d391d8dee148d52016366de1b12de31c08e47 Mon Sep 17 00:00:00 2001 From: Maximilian Stiefel Date: Sat, 13 Jun 2020 19:19:09 +0200 Subject: [PATCH] Cromaticity bytes are implemented --- display_stockach_i2c | 10 +++ display_stockach_parsed | 69 +++++++++++++++++++ edid_stockach.json | 32 ++++++--- main | Bin 49400 -> 49496 bytes main.c | 145 +++++++++++++++++++++++++++++++--------- 5 files changed, 214 insertions(+), 42 deletions(-) create mode 100644 display_stockach_i2c create mode 100644 display_stockach_parsed diff --git a/display_stockach_i2c b/display_stockach_i2c new file mode 100644 index 0000000..9c69718 --- /dev/null +++ b/display_stockach_i2c @@ -0,0 +1,10 @@ +maximilian@ironhero:~/ad9984a_bo$ sudo i2cdump -y -r 0-127 2 0x50 b + 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef +00: 00 ff ff ff ff ff ff 00 1e 6d d5 59 04 45 09 00 ........?m?Y?E?. +10: 03 17 01 03 68 35 1e 78 ea 33 31 a4 57 51 a0 26 ????h5?x?31?WQ?& +20: 10 50 54 a7 6b 80 b3 00 81 80 95 00 71 4f a9 c0 ?PT?k??.???.qO?? +30: 81 00 81 c0 90 40 02 3a 80 18 71 38 2d 40 58 2c ?.???@?:??q8-@X, +40: 45 00 09 25 21 00 00 1e 00 00 00 fd 00 38 4b 1e E.?%!..?...?.8K? +50: 53 0f 00 0a 20 20 20 20 20 20 00 00 00 fc 00 32 S?.? ...?.2 +60: 34 45 4e 33 33 0a 20 20 20 20 20 20 00 00 00 ff 4EN33? .... +70: 00 33 30 33 4e 44 51 41 48 56 34 39 32 0a 00 f1 .303NDQAHV492?.? diff --git a/display_stockach_parsed b/display_stockach_parsed new file mode 100644 index 0000000..e14fe73 --- /dev/null +++ b/display_stockach_parsed @@ -0,0 +1,69 @@ +maximilian@ironhero:~/ad9984a_bo$ sudo python2.7 parse_display_ddc.py +[sudo] password for maximilian: +Header: +7789 + Manufacturer: GSM + Product code: 22997 + Serial number: 607492 + Week: 3 + Year: 2013 + Edid version 1, revision 3 + Analog input + Levels: +.7/0] + Separate sync supported + Horizontal screen size: 53cm + Vertical screen size: 30cm + Display gamma: 2.200 + DPMS standby supported + DPMS suspend supported + DPMS active-off supported + Display type (analog): RGB color + Preferred timing mode in descriptor block 1 +Chromaticity coordinates: r: (0.641, 0.343), g: (0.316, 0.628), b: (0.148, 0.065), w: (0.312, 0.329) +Established timings: + 720x400 @ 70 Hz (VGA) + 640x480 @ 60 Hz (VGA) + 640x480 @ 75 Hz + 800x600 @ 56 Hz + 800x600 @ 60 Hz + 800x600 @ 75 Hz + 832x624 @ 75 Hz (Apple Macintosh II) + 1024x768 @ 60 Hz + 1024x768 @ 75 Hz + 1280x1024 @ 75 Hz + 1152x870 @ 75 Hz (Apple Macintosh II) +Standard timing information: + X res: 1680, aspect 16:10, Y res (derived): 1050), vertical frequency: 60 + X res: 1280, aspect 5:4, Y res (derived): 1024), vertical frequency: 60 + X res: 1440, aspect 16:10, Y res (derived): 900), vertical frequency: 60 + X res: 1152, aspect 4:3, Y res (derived): 864), vertical frequency: 75 + X res: 1600, aspect 16:9, Y res (derived): 900), vertical frequency: 60 + X res: 1280, aspect 16:10, Y res (derived): 800), vertical frequency: 60 + X res: 1280, aspect 16:9, Y res (derived): 720), vertical frequency: 60 + X res: 1400, aspect 4:3, Y res (derived): 1050), vertical frequency: 60 +Descriptor 1: Detailed timing descriptor: + Pixel clock: 148500kHz + 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: 521mm + Vertical image size: 293mm + Horizontal border pixels: 0 + Vertical border lines: 0 + Digital separate sync + VSync serration + Positive horizontal sync polarity +Descriptor 2: Display range limits + Minimum vertical field rate 56Hz + Maximum vertical field rate 75Hz + Minimum horizontal field rate 30Hz + Maximum horizontal field rate 83Hz + Maximum pixel clock rate: 150Mhz + Default GTF +Descriptor 3: Display name 24EN33 +Descriptor 4: Display serial number 303NDQAHV492 diff --git a/edid_stockach.json b/edid_stockach.json index a4dee2b..df1343e 100644 --- a/edid_stockach.json +++ b/edid_stockach.json @@ -8,17 +8,19 @@ "edid_version": 1, "edid_revision": 3 }, - "video_input_parameters": { - "input_type": "analog", - "levels": { - "upper": 0.7, - "lower": 0.0 + "basic_display_parameters": { + "video_input_parameters": { + "input_type": "analog", + "levels": { + "upper": 0.7, + "lower": 0.0 + }, + "blank_to_black": false, + "seperate_sync": true, + "composite_sync": false, + "sync_on_green": false, + "vsync_serrated": false }, - "blank_to_black": false, - "seperate_sync": true, - "composite_sync": false, - "sync_on_green": false, - "vsync_serrated": false, "horizontal_screen_size": 53, "vertical_screen_size": 30, "gamma": 2.2, @@ -33,5 +35,15 @@ "preferred_timing_mode": true, "continuous_timings": false } + }, + "chromaticity_coordinates": { + "red_x": 0.641, + "red_y": 0.343, + "green_x": 0.316, + "green_y": 0.628, + "blue_x": 0.148, + "blue_y": 0.065, + "white_x": 0.3125, + "white_y": 0.329 } } diff --git a/main b/main index 0eb9f1d8f0381b387375054454a4c641af8417c3..765140e27cb50e0edb50b8fb3251ee2225cc6850 100755 GIT binary patch delta 10834 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 delta 9073 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.preamble)+0, 0x00, 1); memset((uint8_t*)&(edid->header.preamble)+1, 0xFF, 6); memset((uint8_t*)&(edid->header.preamble)+7, 0x00, 1); -/*memset( edid + EDID_BYTES_OFFSET_HEADER_PREAMBLE, - 0x00, 1); - memset( edid + EDID_BYTES_OFFSET_HEADER_PREAMBLE + 1, - 0xFF, 6); - memset( edid + EDID_BYTES_OFFSET_HEADER_PREAMBLE + 7, - 0x00, 1); -*/ } static int generate_header(edid_t* edid, unsigned char* json_str, size_t json_len) @@ -234,17 +232,21 @@ static int generate_basic_display_parameters( edid_t* edid, if (edid && json_str) { // Input type analog or digital - json_scanf( json_str, json_len, "{video_input_parameters: {input_type: %Q}", + json_scanf( json_str, json_len, + "{basic_display_parameters: {video_input_parameters: \ + {input_type: %Q}}}", &multi_use_str); if (strcmp(multi_use_str, "analog") == 0) { edid->basic_display_parameters.video_input_parameters .analog.input_type = 0; // Levels json_scanf( json_str, json_len, - "{video_input_parameters: {levels: {upper: %f}}}", + "{basic_display_parameters: {video_input_parameters: \ + {levels: {upper: %f}}}", &multi_use_flt0); json_scanf( json_str, json_len, - "{video_input_parameters: {levels: {lower: %f}}}", + "{basic_display_parameters: {video_input_parameters: \ + {levels: {lower: %f}}}", &multi_use_flt1); if (multi_use_flt0 == 0.7f && multi_use_flt1 == -0.3f) { multi_use_int = 0; @@ -262,31 +264,35 @@ static int generate_basic_display_parameters( edid_t* edid, .analog.levels = 0x3 & multi_use_int; // Blank to black json_scanf( json_str, json_len, - "{video_input_parameters: {blank_to_black: %B}}", + "{basic_display_parameters: {video_input_parameters: \ + {blank_to_black: %B}}}", &multi_use_bool); edid->basic_display_parameters.video_input_parameters .analog.blank_to_black = 0x1 & multi_use_bool; // Seperate sync json_scanf( json_str, json_len, - "{video_input_parameters: {seperate_sync: %B}}", + "{basic_display_parameters: {video_input_parameters: \ + {seperate_sync: %B}}}", &multi_use_bool); edid->basic_display_parameters.video_input_parameters .analog.seperate_sync = 0x1 & multi_use_bool; // Composite sync json_scanf( json_str, json_len, - "{video_input_parameters: {composite_sync: %B}}", + "{basic_display_parameters: {video_input_parameters: \ + {composite_sync: %B}}}", &multi_use_bool); edid->basic_display_parameters.video_input_parameters .analog.composite_sync = 0x1 & multi_use_bool; // Sync on green json_scanf( json_str, json_len, - "{video_input_parameters: {sync_on_green: %B}}", + "{basic_display_parameters: {video_input_parameters: \ + {sync_on_green: %B}}}", &multi_use_bool); edid->basic_display_parameters.video_input_parameters .analog.sync_on_green = 0x1 & multi_use_bool; // Vsync serrated json_scanf( json_str, json_len, - "{video_input_parameters: {blank_to_black: %B}}", + "{video_input_parameters: {sync_on_green: %B}}", &multi_use_bool); edid->basic_display_parameters.video_input_parameters .analog.blank_to_black = 0x1 & multi_use_bool; @@ -302,40 +308,40 @@ static int generate_basic_display_parameters( edid_t* edid, free(multi_use_str); // Horizontal screen size json_scanf( json_str, json_len, - "{video_input_parameters: {horizontal_screen_size: %d}}", + "{basic_display_parameters: {horizontal_screen_size: %d}}", &multi_use_int); edid->basic_display_parameters .horizontal_screen_size = multi_use_int; // Vertical screen size json_scanf( json_str, json_len, - "{video_input_parameters: {vertical_screen_size: %d}}", + "{basic_display_parameters: {vertical_screen_size: %d}}", &multi_use_int); edid->basic_display_parameters .vertical_screen_size = multi_use_int; // Horizontal screen size json_scanf( json_str, json_len, - "{video_input_parameters: {gamma: %f}}", + "{basic_display_parameters: {gamma: %f}}", &multi_use_flt0); edid->basic_display_parameters .gamma = (multi_use_flt0-1)*100; // Display Power Management Signaling (DPMS) // Standby json_scanf( json_str, json_len, - "{video_input_parameters: {features: {dpms: \ + "{basic_display_parameters: {features: {dpms: \ {standby_supported: %B}}}}", &multi_use_bool); edid->basic_display_parameters .features.dpms_standby_supported = 0x1 & multi_use_bool; // Suspend json_scanf( json_str, json_len, - "{video_input_parameters: {features: {dpms: \ + "{basic_display_parameters: {features: {dpms: \ {suspend_supported: %B}}}}", &multi_use_bool); edid->basic_display_parameters .features.dpms_suspend_supported = 0x1 & multi_use_bool; // Active-off json_scanf( json_str, json_len, - "{video_input_parameters: {features: {dpms: \ + "{basic_display_parameters: {features: {dpms: \ {active_off_supported: %B}}}}", &multi_use_bool); edid->basic_display_parameters @@ -344,7 +350,7 @@ static int generate_basic_display_parameters( edid_t* edid, char a_str[] = "analog"; char d_str[] = "digital"; json_scanf( json_str, json_len, - "{video_input_parameters: {features: {display_type: %Q}}}", + "{basic_display_parameters: {features: {display_type: %Q}}}", &multi_use_str); // Create substrings for comparison memcpy(a_str, multi_use_str, strlen(a_str)); @@ -380,19 +386,20 @@ static int generate_basic_display_parameters( edid_t* edid, free(multi_use_str); // Standard sRGB json_scanf( json_str, json_len, - "{video_input_parameters: {features: {standard_srgb: %B}}}", + "{basic_display_parameters: {features: {standard_srgb: %B}}}", &multi_use_bool); edid->basic_display_parameters .features.standard_srgb = 0x1 & multi_use_bool; // Prefered timing mode json_scanf( json_str, json_len, - "{video_input_parameters: {features: {preferred_timing_mode: %B}}}", + "{basic_display_parameters: {features: \ + {preferred_timing_mode: %B}}}", &multi_use_bool); edid->basic_display_parameters .features.preferred_timing_mode = 0x1 & multi_use_bool; // Continuous timings json_scanf( json_str, json_len, - "{video_input_parameters: {features: {continuous_timings: %B}}}", + "{basic_display_parameters: {features: {continuous_timings: %B}}}", &multi_use_bool); edid->basic_display_parameters .features.continuous_timings = 0x1 & multi_use_bool; @@ -403,6 +410,79 @@ static int generate_basic_display_parameters( edid_t* edid, return 0; } +static int generate_chromaticity_coordinates( edid_t* edid, + unsigned char* json_str, + size_t json_len) +{ + float multi_use_flt; + unsigned int multi_use_int; + + if (edid && json_str) { + // Red x + json_scanf( json_str, json_len, + "{chromaticity_coordinates: {red_x: %f}}", + &multi_use_flt); + multi_use_int = stp_round(1024.0f * multi_use_flt); + edid->chromaticity_coordinates.red_green_lsbs.red_x = 0x3 & multi_use_int; + edid->chromaticity_coordinates.red_x_msbs = 0xFF & multi_use_int >> 2; + // Red y + json_scanf( json_str, json_len, + "{chromaticity_coordinates: {red_y: %f}}", + &multi_use_flt); + multi_use_int = stp_round(1024.0f * multi_use_flt); + edid->chromaticity_coordinates.red_green_lsbs.red_y = 0x3 & multi_use_int; + edid->chromaticity_coordinates.red_y_msbs = 0xFF & multi_use_int >> 2; + // Green x + json_scanf( json_str, json_len, + "{chromaticity_coordinates: {green_x: %f}}", + &multi_use_flt); + multi_use_int = stp_round(1024.0f * multi_use_flt); + edid->chromaticity_coordinates.red_green_lsbs.green_x = 0x3 & multi_use_int; + edid->chromaticity_coordinates.green_x_msbs = 0xFF & multi_use_int >> 2; + // Green y + json_scanf( json_str, json_len, + "{chromaticity_coordinates: {green_y: %f}}", + &multi_use_flt); + multi_use_int = stp_round(1024.0f * multi_use_flt); + edid->chromaticity_coordinates.red_green_lsbs.green_y = 0x3 & multi_use_int; + edid->chromaticity_coordinates.green_y_msbs = 0xFF & multi_use_int >> 2; + // Blue x + json_scanf( json_str, json_len, + "{chromaticity_coordinates: {blue_x: %f}}", + &multi_use_flt); + multi_use_int = stp_round(1024.0f * multi_use_flt); + edid->chromaticity_coordinates.blue_white_lsbs.blue_x = 0x3 & multi_use_int; + edid->chromaticity_coordinates.blue_x_msbs = 0xFF & multi_use_int >> 2; + // Blue y + json_scanf( json_str, json_len, + "{chromaticity_coordinates: {blue_y: %f}}", + &multi_use_flt); + multi_use_int = stp_round(1024.0f * multi_use_flt); + edid->chromaticity_coordinates.blue_white_lsbs.blue_y = 0x3 & multi_use_int; + edid->chromaticity_coordinates.blue_y_msbs = 0xFF & multi_use_int >> 2; + // White x + json_scanf( json_str, json_len, + "{chromaticity_coordinates: {white_x: %f}}", + &multi_use_flt); + multi_use_int = stp_round(1024.0f * multi_use_flt); + printf("white_y>%f, %d\n", multi_use_flt, multi_use_int); + edid->chromaticity_coordinates.blue_white_lsbs.white_x = 0x3 & multi_use_int; + edid->chromaticity_coordinates.white_x_msbs = 0xFF & multi_use_int >> 2; + // White y + json_scanf( json_str, json_len, + "{chromaticity_coordinates: {white_y: %f}}", + &multi_use_flt); + multi_use_int = stp_round(1024.0f * multi_use_flt); + printf("white_y>%f, %d\n", multi_use_flt, multi_use_int); + edid->chromaticity_coordinates.blue_white_lsbs.white_y = 0x3 & multi_use_int; + edid->chromaticity_coordinates.white_y_msbs = 0xFF & multi_use_int >> 2; + } 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]; @@ -419,6 +499,7 @@ int main(void) } generate_header(&edith, mystr, len); generate_basic_display_parameters(&edith, mystr, len); + generate_chromaticity_coordinates(&edith, mystr, len); disp_buf((uint8_t*)&edith, EDID_LENGTH); return 0; }