xref: /aosp_15_r20/external/edid-decode/parse-ls-ext-block.cpp (revision 193032a37cc83cffc1526215991f3c21671f4245)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright 2019-2020 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
4  *
5  * Author: Hans Verkuil <[email protected]>
6  */
7 
8 #include "edid-decode.h"
9 
parse_string(const char * name,const unsigned char * x)10 static void parse_string(const char *name, const unsigned char *x)
11 {
12 	if (!*x)
13 		return;
14 	printf("  %s: ", name);
15 	hex_block("", x + 1, *x, true, *x);
16 }
17 
parse_string_table(const unsigned char * x)18 void edid_state::parse_string_table(const unsigned char *x)
19 {
20 	printf("  UTF Type: ");
21 	switch (x[0] & 7) {
22 	case 0: printf("UTF 8\n"); break;
23 	case 1: printf("UTF 16BE\n"); break;
24 	case 2: printf("UTF 32BE\n"); break;
25 	default:
26 		printf("Unknown (0x%02x)\n", x[0] & 7);
27 		fail("Unknown UTF Type (0x%02x).\n", x[0] & 7);
28 		break;
29 	}
30 	printf("  Country Code ID (ISO 3166-3): %u\n", ((x[1] & 0x3f) << 8) | x[2]);
31 
32 	if (x[3] || x[4]) {
33 		char name[4];
34 
35 		name[0] = ((x[3] & 0x7c) >> 2) + '@';
36 		name[1] = ((x[3] & 0x03) << 3) + ((x[4] & 0xe0) >> 5) + '@';
37 		name[2] = (x[4] & 0x1f) + '@';
38 		name[3] = 0;
39 		if (name[0] == '@') name[0] = ' ';
40 		if (name[1] == '@') name[1] = ' ';
41 		if (name[2] == '@') name[2] = ' ';
42 		printf("  Language ID: '%s'\n", name);
43 	}
44 	x += 5;
45 	parse_string("Manufacturer Name", x);
46 	x += x[0] + 1;
47 	parse_string("Model Name", x);
48 	x += x[0] + 1;
49 	if (hide_serial_numbers)
50 		printf("  Serial Number: ...\n");
51 	else
52 		parse_string("Serial Number", x);
53 }
54 
parse_ls_ext_block(const unsigned char * x)55 void edid_state::parse_ls_ext_block(const unsigned char *x)
56 {
57 	const unsigned char *orig = x;
58 
59 	printf("  Version: %u.%u\n  Unicode Version: %u.%u.%u\n",
60 	       x[1], x[2], (x[3] >> 4), x[3] & 0x0f, x[4]);
61 	x += 5;
62 
63 	while (x[0] && x + x[0] < orig + 127) {
64 		parse_string_table(x + 1);
65 		x += x[0];
66 	}
67 	if (!memchk(x, orig + 127 - x)) {
68 		data_block.clear();
69 		fail("Non-zero values in unused space.\n");
70 	}
71 }
72