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