mirror of
https://gitlab.freedesktop.org/emersion/libdisplay-info.git
synced 2024-12-26 21:59:15 +01:00
edid: encode vendor & product information
Signed-off-by: Simon Ser <contact@emersion.fr>
This commit is contained in:
parent
bed829366e
commit
76e836df7f
1 changed files with 60 additions and 0 deletions
60
edid.c
60
edid.c
|
@ -1708,6 +1708,62 @@ error:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
encode_vendor_product(const struct di_edid_vendor_product *vendor_product,
|
||||||
|
uint8_t data[static EDID_BLOCK_SIZE])
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
uint16_t man;
|
||||||
|
char ch;
|
||||||
|
int year;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
ch = vendor_product->manufacturer[i];
|
||||||
|
if (ch < '@' || ch > '@' + 0x1F) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
man = (uint16_t)((vendor_product->manufacturer[0] - '@') << 10) |
|
||||||
|
(uint16_t)((vendor_product->manufacturer[1] - '@') << 5) |
|
||||||
|
(uint16_t)((vendor_product->manufacturer[2] - '@') << 0);
|
||||||
|
data[0x08] = (uint8_t)(man >> 8);
|
||||||
|
data[0x09] = (uint8_t)man;
|
||||||
|
|
||||||
|
data[0x0A] = (uint8_t)vendor_product->product;
|
||||||
|
data[0x0B] = (uint8_t)(vendor_product->product >> 8);
|
||||||
|
|
||||||
|
data[0x0C] = (uint8_t)vendor_product->serial;
|
||||||
|
data[0x0D] = (uint8_t)(vendor_product->serial >> 8);
|
||||||
|
data[0x0E] = (uint8_t)(vendor_product->serial >> 16);
|
||||||
|
data[0x0F] = (uint8_t)(vendor_product->serial >> 24);
|
||||||
|
|
||||||
|
if (vendor_product->manufacture_year != 0 && vendor_product->model_year != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (vendor_product->manufacture_week != 0) {
|
||||||
|
if (vendor_product->manufacture_week < 1 ||
|
||||||
|
vendor_product->manufacture_week > 54 ||
|
||||||
|
vendor_product->model_year != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
data[0x10] = (uint8_t)vendor_product->manufacture_week;
|
||||||
|
} else {
|
||||||
|
if (vendor_product->model_year != 0) {
|
||||||
|
data[0x10] = 0xFF;
|
||||||
|
year = vendor_product->model_year;
|
||||||
|
} else {
|
||||||
|
year = vendor_product->manufacture_year;
|
||||||
|
}
|
||||||
|
if (year <= 1990 || year >= 1990 + 0xFF) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
data[0x11] = (uint8_t)(year - 1990);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
di_edid_format(const struct di_edid *edid, void *buf, size_t buf_size)
|
di_edid_format(const struct di_edid *edid, void *buf, size_t buf_size)
|
||||||
{
|
{
|
||||||
|
@ -1728,6 +1784,10 @@ di_edid_format(const struct di_edid *edid, void *buf, size_t buf_size)
|
||||||
data[0x12] = (uint8_t) edid->version;
|
data[0x12] = (uint8_t) edid->version;
|
||||||
data[0x13] = (uint8_t) edid->revision;
|
data[0x13] = (uint8_t) edid->revision;
|
||||||
|
|
||||||
|
if (!encode_vendor_product(&edid->vendor_product, data)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
|
||||||
return (ssize_t) size;
|
return (ssize_t) size;
|
||||||
|
|
Loading…
Reference in a new issue