From 3792ab804dc803f8cbb167178e499f9d5d9b6310 Mon Sep 17 00:00:00 2001 From: Pier Luigi Fiorini Date: Wed, 14 Dec 2016 07:21:44 +0100 Subject: eglfs_kms: Decode EDID blob Retrieve and parse EDID blob. Return screen product information from EDID. [ChangeLog][QPA][eglfs][kms] Add screen product information from EDID. Change-Id: I766999afd9298e82f6147fdeba5d14757bfb4b03 Reviewed-by: Laszlo Agocs --- src/platformsupport/kmsconvenience/qkmsdevice.cpp | 23 +++++++++++++++ src/platformsupport/kmsconvenience/qkmsdevice_p.h | 2 ++ .../deviceintegration/eglfs_kms/eglfs_kms.pro | 2 +- .../eglfs_kms_egldevice/eglfs_kms_egldevice.pro | 2 +- .../eglfs_kms_support/eglfs_kms_support.pro | 2 +- .../eglfs_kms_support/qeglfskmsscreen.cpp | 33 +++++++++++++++++++++- .../eglfs_kms_support/qeglfskmsscreen.h | 6 ++++ 7 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/platformsupport/kmsconvenience/qkmsdevice.cpp b/src/platformsupport/kmsconvenience/qkmsdevice.cpp index fcc068c202..71b7633e6c 100644 --- a/src/platformsupport/kmsconvenience/qkmsdevice.cpp +++ b/src/platformsupport/kmsconvenience/qkmsdevice.cpp @@ -336,6 +336,7 @@ QPlatformScreen *QKmsDevice::createScreenForConnector(drmModeResPtr resources, modes, connector->subpixel, connectorProperty(connector, QByteArrayLiteral("DPMS")), + connectorPropertyBlob(connector, QByteArrayLiteral("EDID")), false, 0, false @@ -383,6 +384,23 @@ drmModePropertyPtr QKmsDevice::connectorProperty(drmModeConnectorPtr connector, return Q_NULLPTR; } +drmModePropertyBlobPtr QKmsDevice::connectorPropertyBlob(drmModeConnectorPtr connector, const QByteArray &name) +{ + drmModePropertyPtr prop; + drmModePropertyBlobPtr blob = nullptr; + + for (int i = 0; i < connector->count_props && !blob; i++) { + prop = drmModeGetProperty(m_dri_fd, connector->props[i]); + if (!prop) + continue; + if ((prop->flags & DRM_MODE_PROP_BLOB) && (strcmp(prop->name, name.constData()) == 0)) + blob = drmModeGetPropertyBlob(m_dri_fd, connector->prop_values[i]); + drmModeFreeProperty(prop); + } + + return blob; +} + QKmsDevice::QKmsDevice(QKmsScreenConfig *screenConfig, const QString &path) : m_screenConfig(screenConfig) , m_path(path) @@ -627,6 +645,11 @@ void QKmsOutput::cleanup(QKmsDevice *device) dpms_prop = nullptr; } + if (edid_blob) { + drmModeFreePropertyBlob(edid_blob); + edid_blob = nullptr; + } + restoreMode(device); if (saved_crtc) { diff --git a/src/platformsupport/kmsconvenience/qkmsdevice_p.h b/src/platformsupport/kmsconvenience/qkmsdevice_p.h index 55b572f0dd..964a0b1775 100644 --- a/src/platformsupport/kmsconvenience/qkmsdevice_p.h +++ b/src/platformsupport/kmsconvenience/qkmsdevice_p.h @@ -107,6 +107,7 @@ struct QKmsOutput QList modes; int subpixel; drmModePropertyPtr dpms_prop; + drmModePropertyBlobPtr edid_blob; bool wants_plane; uint32_t plane_id; bool plane_set; @@ -154,6 +155,7 @@ protected: drmModeConnectorPtr connector, VirtualDesktopInfo *vinfo); drmModePropertyPtr connectorProperty(drmModeConnectorPtr connector, const QByteArray &name); + drmModePropertyBlobPtr connectorPropertyBlob(drmModeConnectorPtr connector, const QByteArray &name); QKmsScreenConfig *m_screenConfig; QString m_path; diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro index e522c0ee1b..27c0af1f08 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro @@ -4,7 +4,7 @@ PLUGIN_TYPE = egldeviceintegrations PLUGIN_CLASS_NAME = QEglFSKmsGbmIntegrationPlugin load(qt_plugin) -QT += core-private gui-private eglfsdeviceintegration-private eglfs_kms_support-private kms_support-private +QT += core-private gui-private eglfsdeviceintegration-private eglfs_kms_support-private kms_support-private edid_support-private INCLUDEPATH += $$PWD/../../api $$PWD/../eglfs_kms_support diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro index a2dc9c4a50..36f037ac6c 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro @@ -1,6 +1,6 @@ TARGET = qeglfs-kms-egldevice-integration -QT += core-private gui-private eglfsdeviceintegration-private eglfs_kms_support-private kms_support-private +QT += core-private gui-private eglfsdeviceintegration-private eglfs_kms_support-private kms_support-private edid_support-private INCLUDEPATH += $$PWD/../../api $$PWD/../eglfs_kms_support diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro index 3c0a0ce30f..88cf6db33b 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro @@ -2,7 +2,7 @@ TARGET = QtEglFsKmsSupport CONFIG += no_module_headers internal_module load(qt_module) -QT += core-private gui-private eglfsdeviceintegration-private kms_support-private +QT += core-private gui-private eglfsdeviceintegration-private kms_support-private edid_support-private INCLUDEPATH += $$PWD/../../api diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp index 6c8fffd8d9..7414495f07 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2015 Pier Luigi Fiorini +** Copyright (C) 2017 Pier Luigi Fiorini ** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2016 Pelagicore AG ** Contact: https://www.qt.io/licensing/ @@ -76,6 +76,22 @@ QEglFSKmsScreen::QEglFSKmsScreen(QKmsDevice *device, const QKmsOutput &output) , m_interruptHandler(new QEglFSKmsInterruptHandler(this)) { m_siblings << this; // gets overridden later + + if (m_output.edid_blob) { + QByteArray edid(reinterpret_cast(m_output.edid_blob->data), m_output.edid_blob->length); + if (m_edid.parse(edid)) + qCDebug(qLcEglfsKmsDebug, "EDID data for output \"%s\": identifier '%s', manufacturer '%s', model '%s', serial '%s', physical size: %.2fx%.2f", + name().toLatin1().constData(), + m_edid.identifier.toLatin1().constData(), + m_edid.manufacturer.toLatin1().constData(), + m_edid.model.toLatin1().constData(), + m_edid.serialNumber.toLatin1().constData(), + m_edid.physicalSize.width(), m_edid.physicalSize.height()); + else + qCWarning(qLcEglfsKmsDebug) << "Failed to parse EDID data for output" << name(); + } else { + qCWarning(qLcEglfsKmsDebug) << "No EDID data for output" << name(); + } } QEglFSKmsScreen::~QEglFSKmsScreen() @@ -146,6 +162,21 @@ QString QEglFSKmsScreen::name() const return m_output.name; } +QString QEglFSKmsScreen::manufacturer() const +{ + return m_edid.manufacturer; +} + +QString QEglFSKmsScreen::model() const +{ + return m_edid.model.isEmpty() ? m_edid.identifier : m_edid.model; +} + +QString QEglFSKmsScreen::serialNumber() const +{ + return m_edid.serialNumber; +} + void QEglFSKmsScreen::destroySurface() { } diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h index c90e917f0a..4e09929189 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h @@ -47,6 +47,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -72,6 +73,10 @@ public: QString name() const override; + QString manufacturer() const override; + QString model() const override; + QString serialNumber() const override; + qreal refreshRate() const override; QList virtualSiblings() const override { return m_siblings; } @@ -102,6 +107,7 @@ protected: QKmsDevice *m_device; QKmsOutput m_output; + QEdidParser m_edid; QPoint m_pos; QList m_siblings; -- cgit v1.2.3