2022-08-31 12:16:36 +02:00
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
#include "bits.h"
|
|
|
|
#include "displayid.h"
|
|
|
|
|
2022-09-02 08:47:38 +02:00
|
|
|
/**
|
|
|
|
* The size of the mandatory fields in a DisplayID section.
|
|
|
|
*/
|
|
|
|
#define DISPLAYID_MIN_SIZE 5
|
|
|
|
/**
|
|
|
|
* The maximum size of a DisplayID section.
|
|
|
|
*/
|
|
|
|
#define DISPLAYID_MAX_SIZE 256
|
|
|
|
|
2022-08-31 12:16:36 +02:00
|
|
|
bool
|
|
|
|
_di_displayid_parse(struct di_displayid *displayid, const uint8_t *data,
|
|
|
|
size_t size, struct di_logger *logger)
|
|
|
|
{
|
2022-09-02 08:47:38 +02:00
|
|
|
size_t section_size;
|
|
|
|
|
2022-08-31 12:16:36 +02:00
|
|
|
if (size < 5) {
|
|
|
|
errno = EINVAL;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
displayid->version = get_bit_range(data[0x00], 7, 4);
|
|
|
|
displayid->revision = get_bit_range(data[0x00], 3, 0);
|
|
|
|
if (displayid->version == 0 || displayid->version > 1) {
|
|
|
|
errno = ENOTSUP;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-09-02 08:47:38 +02:00
|
|
|
section_size = (size_t) data[0x01] + DISPLAYID_MIN_SIZE;
|
|
|
|
if (section_size > DISPLAYID_MAX_SIZE || section_size > size) {
|
|
|
|
errno = EINVAL;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-08-31 12:16:36 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
di_displayid_get_version(const struct di_displayid *displayid)
|
|
|
|
{
|
|
|
|
return displayid->version;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
di_displayid_get_revision(const struct di_displayid *displayid)
|
|
|
|
{
|
|
|
|
return displayid->revision;
|
|
|
|
}
|