|
@ -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; |
|
|
} |
|
|
} |
|
|