79 auto cacheIt = cache.constFind(connectorName);
80 if (cacheIt != cache.constEnd()) {
86 QDir drmDir(QStringLiteral(
"/sys/class/drm"));
87 if (drmDir.exists()) {
88 const QStringList entries = drmDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
89 for (
const QString& entry : entries) {
90 int dashPos = entry.indexOf(QLatin1Char(
'-'));
94 if (entry.mid(dashPos + 1) != connectorName) {
97 QFile edidFile(drmDir.filePath(entry) + QStringLiteral(
"/edid"));
98 if (!edidFile.open(QIODevice::ReadOnly)) {
101 QByteArray header = edidFile.read(16);
102 if (header.size() < 16) {
105 const auto* data =
reinterpret_cast<const uint8_t*
>(header.constData());
106 if (data[0] != 0x00 || data[1] != 0xFF || data[2] != 0xFF || data[3] != 0xFF || data[4] != 0xFF
107 || data[5] != 0xFF || data[6] != 0xFF || data[7] != 0x00) {
110 uint32_t serial = data[12] | (
static_cast<uint32_t
>(data[13]) << 8)
111 | (
static_cast<uint32_t
>(data[14]) << 16) | (
static_cast<uint32_t
>(data[15]) << 24);
113 result = QString::number(serial);
119 if (!result.isEmpty()) {
120 cache.insert(connectorName, result);
123 constexpr int maxRetries = 3;
126 if (misses >= maxRetries) {
127 cache.insert(connectorName, result);
157 if (!serial.isEmpty() && serial.startsWith(QLatin1String(
"0x"), Qt::CaseInsensitive)) {
159 uint32_t numericSerial = serial.toUInt(&ok, 16);
160 if (ok && numericSerial != 0) {
161 return QString::number(numericSerial);