| 
						
						
							
								
							
						
						
					 | 
					@ -4,7 +4,8 @@ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					#include <stdlib.h> | 
					 | 
					 | 
					#include <stdlib.h> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					#include "frozen/frozen.h" | 
					 | 
					 | 
					#include "frozen/frozen.h" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					#define EDID_LENGTH 128 | 
					 | 
					 | 
					#define EDID_LEN 128 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					#define EDID_DISPLAY_DESCRIPTOR_DATA_LEN 13 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					enum edid_analog_display_t { | 
					 | 
					 | 
					enum edid_analog_display_t { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  EDID_DISPLAY_TYPE_MONOCHROME_OR_GRAYSCALE = 0, | 
					 | 
					 | 
					  EDID_DISPLAY_TYPE_MONOCHROME_OR_GRAYSCALE = 0, | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -113,7 +114,7 @@ typedef struct __attribute__ (( packed )) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  uint8_t reserved0; | 
					 | 
					 | 
					  uint8_t reserved0; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  uint8_t descriptor_type; | 
					 | 
					 | 
					  uint8_t descriptor_type; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  uint8_t reserved1; | 
					 | 
					 | 
					  uint8_t reserved1; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					  uint8_t descriptor_data[13]; | 
					 | 
					 | 
					  uint8_t descriptor_data[EDID_DISPLAY_DESCRIPTOR_DATA_LEN]; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					} display_descriptor_t; | 
					 | 
					 | 
					} display_descriptor_t; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					typedef struct __attribute__ (( packed )) { | 
					 | 
					 | 
					typedef struct __attribute__ (( packed )) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -972,13 +973,13 @@ static int generate_display_name_descriptor( | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                "{display_name_descriptor: {name: %Q}}", | 
					 | 
					 | 
					                "{display_name_descriptor: {name: %Q}}", | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                &display_name); | 
					 | 
					 | 
					                &display_name); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    if (display_name != NULL) { | 
					 | 
					 | 
					    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)); | 
					 | 
					 | 
					        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 | 
					 | 
					 | 
					          memset( edid->display_name_descriptor.descriptor_data | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                  + strlen(display_name), 0x0A, 1); | 
					 | 
					 | 
					                  + strlen(display_name), 0x0A, 1); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          memset( edid->display_name_descriptor.descriptor_data | 
					 | 
					 | 
					          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 { | 
					 | 
					 | 
					      } else { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        printf("Error: Display name is too long.\n"); | 
					 | 
					 | 
					        printf("Error: Display name is too long.\n"); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -995,9 +996,69 @@ static int generate_display_name_descriptor( | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  return 0; | 
					 | 
					 | 
					  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; sanny<EDID_LEN-1; sanny++) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      sum += _edid[sanny]; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    edid->checksum = 256-(sum % 256); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					  } else { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    printf("Error: One of either edid or json_str is NULL.\n"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return 1; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					  return 0; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					int main(void) | 
					 | 
					 | 
					int main(void) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  //uint8_t edith[EDID_LENGTH];
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  edid_t edith; | 
					 | 
					 | 
					  edid_t edith; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  memset(&edith, 0x00, sizeof(edith)); | 
					 | 
					 | 
					  memset(&edith, 0x00, sizeof(edith)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  printf("size> %d bytes\n", sizeof(edith)); | 
					 | 
					 | 
					  printf("size> %d bytes\n", sizeof(edith)); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -1016,7 +1077,9 @@ int main(void) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  generate_detailed_timing_descriptor(&edith, mystr, len); | 
					 | 
					 | 
					  generate_detailed_timing_descriptor(&edith, mystr, len); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  generate_range_limit_descriptor(&edith, mystr, len); | 
					 | 
					 | 
					  generate_range_limit_descriptor(&edith, mystr, len); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  generate_display_name_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); | 
					 | 
					 | 
					  free(mystr); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  return 0; | 
					 | 
					 | 
					  return 0; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					
  |