From 3e386c1792d893f5c75bc02b1e86fafc1b7b2383 Mon Sep 17 00:00:00 2001 From: Maximilian Stiefel Date: Wed, 24 Jun 2020 23:08:28 +0200 Subject: [PATCH] Display serial number descriptor and checksum implemented --- edid_stockach.json | 3 ++ main.c | 77 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 73 insertions(+), 7 deletions(-) diff --git a/edid_stockach.json b/edid_stockach.json index 22d755d..7155f0e 100644 --- a/edid_stockach.json +++ b/edid_stockach.json @@ -148,5 +148,8 @@ }, "display_name_descriptor": { "name": "24EN33" + }, + "display_serial_number_descriptor": { + "serial_number": "303NDQAHV492" } } diff --git a/main.c b/main.c index 2782db3..171b0ce 100644 --- a/main.c +++ b/main.c @@ -4,7 +4,8 @@ #include #include "frozen/frozen.h" -#define EDID_LENGTH 128 +#define EDID_LEN 128 +#define EDID_DISPLAY_DESCRIPTOR_DATA_LEN 13 enum edid_analog_display_t { EDID_DISPLAY_TYPE_MONOCHROME_OR_GRAYSCALE = 0, @@ -113,7 +114,7 @@ typedef struct __attribute__ (( packed )) { uint8_t reserved0; uint8_t descriptor_type; uint8_t reserved1; - uint8_t descriptor_data[13]; + uint8_t descriptor_data[EDID_DISPLAY_DESCRIPTOR_DATA_LEN]; } display_descriptor_t; typedef struct __attribute__ (( packed )) { @@ -972,13 +973,13 @@ static int generate_display_name_descriptor( "{display_name_descriptor: {name: %Q}}", &display_name); if (display_name != NULL) { - if (strlen(display_name) <= 13) { + if (strlen(display_name) <= EDID_DISPLAY_DESCRIPTOR_DATA_LEN) { memcpy(edid->display_name_descriptor.descriptor_data, display_name, strlen(display_name)); - if (strlen(display_name) < 13) { + if (strlen(display_name) < EDID_DISPLAY_DESCRIPTOR_DATA_LEN) { memset( edid->display_name_descriptor.descriptor_data + strlen(display_name), 0x0A, 1); memset( edid->display_name_descriptor.descriptor_data - + strlen(display_name) + 1, 0x20, 13-strlen(display_name)-1); + + strlen(display_name) + 1, 0x20, EDID_DISPLAY_DESCRIPTOR_DATA_LEN-strlen(display_name)-1); } } else { printf("Error: Display name is too long.\n"); @@ -995,9 +996,69 @@ static int generate_display_name_descriptor( return 0; } +static int generate_display_serial_number_descriptor( + edid_t* edid, + unsigned char* json_str, + size_t json_len) +{ + char* serial_number = NULL; + + if (edid && json_str) { + edid->display_serial_number_descriptor.display_descriptor = 0; + edid->display_serial_number_descriptor.reserved0 = 0; + edid->display_serial_number_descriptor.descriptor_type = 0xFF; + edid->display_serial_number_descriptor.reserved1 = 0; + json_scanf( json_str, json_len, + "{display_serial_number_descriptor: {serial_number: %Q}}", + &serial_number); + if (serial_number != NULL) { + if (strlen(serial_number) <= EDID_DISPLAY_DESCRIPTOR_DATA_LEN) { + memcpy(edid->display_serial_number_descriptor.descriptor_data, serial_number, strlen(serial_number)); + if (strlen(serial_number) < EDID_DISPLAY_DESCRIPTOR_DATA_LEN) { + memset( edid->display_serial_number_descriptor.descriptor_data + + strlen(serial_number), 0x0A, 1); + memset( edid->display_serial_number_descriptor.descriptor_data + + strlen(serial_number) + 1, 0x20, EDID_DISPLAY_DESCRIPTOR_DATA_LEN-strlen(serial_number)-1); + } + } else { + printf("Error: Display name is too long.\n"); + return 1; + } + } else { + printf("Error: Could not parse JSON file somewhere around display_serial_number_descriptor.\n"); + return 1; + } + } else { + printf("Error: One of either edid or json_str is NULL.\n"); + return 1; + } + return 0; +} + +static int generate_checksum( + edid_t* edid, + unsigned char* json_str, + size_t json_len) +{ + uint8_t* _edid = NULL; + unsigned int sum = 0; + + if (edid && json_str) { + // Was ist denn mit Carsten los? + _edid = (uint8_t*)edid; + for (int sanny=0; sannychecksum = 256-(sum % 256); + } 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]; edid_t edith; memset(&edith, 0x00, sizeof(edith)); printf("size> %d bytes\n", sizeof(edith)); @@ -1016,7 +1077,9 @@ int main(void) generate_detailed_timing_descriptor(&edith, mystr, len); generate_range_limit_descriptor(&edith, mystr, len); generate_display_name_descriptor(&edith, mystr, len); - disp_buf((uint8_t*)&edith, EDID_LENGTH); + generate_display_serial_number_descriptor(&edith, mystr, len); + generate_checksum(&edith, mystr, len); + disp_buf((uint8_t*)&edith, EDID_LEN); free(mystr); return 0; }