diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2019-01-11 12:09:40 +0200 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2019-01-14 09:27:28 +0200 |
commit | 82b200e00c2c7dbeae108b21b2bba39305300d4a (patch) | |
tree | 9b2c3970fa97256a15ce520fdb0da0d4682036ac | |
parent | 6126525e3921d2ccc54ca393e6a24d4bd0f08429 (diff) |
card: add open_modesetting_card()
Add open_modesetting_card() which iterates the DRM cards and returns the
first one that has crtcs and connectors.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r-- | kms++/inc/kms++/card.h | 3 | ||||
-rw-r--r-- | kms++/src/card.cpp | 20 |
2 files changed, 23 insertions, 0 deletions
diff --git a/kms++/inc/kms++/card.h b/kms++/inc/kms++/card.h index 72111f1..4b0d877 100644 --- a/kms++/inc/kms++/card.h +++ b/kms++/inc/kms++/card.h @@ -3,6 +3,7 @@ #include <cstdint> #include <vector> #include <map> +#include <memory> #include "decls.h" #include "pipeline.h" @@ -13,6 +14,8 @@ class Card { friend class Framebuffer; public: + static std::unique_ptr<Card> open_modesetting_card(); + Card(); Card(const std::string& dev_path); Card(const std::string& driver, uint32_t idx); diff --git a/kms++/src/card.cpp b/kms++/src/card.cpp index 4632f22..04750af 100644 --- a/kms++/src/card.cpp +++ b/kms++/src/card.cpp @@ -7,6 +7,7 @@ #include <algorithm> #include <cerrno> #include <algorithm> +#include <sys/stat.h> #include <xf86drm.h> #include <xf86drmMode.h> @@ -18,6 +19,25 @@ using namespace std; namespace kms { +unique_ptr<Card> Card::open_modesetting_card() +{ + for (uint32_t i = 0; ; ++i) { + string path = "/dev/dri/card" + to_string(i); + + struct stat buffer; + if (stat(path.c_str(), &buffer)) + break; + + unique_ptr<Card> card = unique_ptr<Card>(new Card(path)); + + if (card->get_connectors().size() > 0 && + card->get_crtcs().size() > 0) + return card; + } + + throw runtime_error("No modesetting DRM card found"); +} + static int open_device_by_path(string path) { int fd = open(path.c_str(), O_RDWR | O_CLOEXEC); |