Browse Source

Display serial number descriptor and checksum implemented

master
Maximilian Stiefel 4 years ago
parent
commit
3e386c1792
  1. 3
      edid_stockach.json
  2. 77
      main.c

3
edid_stockach.json

@ -148,5 +148,8 @@
},
"display_name_descriptor": {
"name": "24EN33"
},
"display_serial_number_descriptor": {
"serial_number": "303NDQAHV492"
}
}

77
main.c

@ -4,7 +4,8 @@
#include <stdlib.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 {
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; 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)
{
//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;
}

Loading…
Cancel
Save