summaryrefslogtreecommitdiff
path: root/utils/kmsprint.cpp
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2016-05-23 09:54:08 +0300
committerTomi Valkeinen <tomi.valkeinen@ti.com>2016-05-23 09:54:08 +0300
commita5c28bcb2ead34e921617711ebf94ffcb5d72878 (patch)
treee2f93259f63407357c70b06a7d59c24fde5a3901 /utils/kmsprint.cpp
parent0bc5bbd6766949d651f98e12981d79c86ce0bf99 (diff)
File/dir renames
Diffstat (limited to 'utils/kmsprint.cpp')
-rw-r--r--utils/kmsprint.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/utils/kmsprint.cpp b/utils/kmsprint.cpp
new file mode 100644
index 0000000..7b9de8c
--- /dev/null
+++ b/utils/kmsprint.cpp
@@ -0,0 +1,221 @@
+#include <cstdio>
+#include <algorithm>
+#include <iostream>
+
+#include "kms++.h"
+#include "opts.h"
+
+using namespace std;
+using namespace kms;
+
+namespace kmsprint {
+
+static struct {
+ bool print_props;
+ bool print_modes;
+ bool recurse;
+} opts;
+
+string width(int w, string str)
+{
+ str.resize(w, ' ');
+ return str;
+}
+
+void print_mode(const Videomode &m, int ind)
+{
+ printf("%s%s %6d %4d %4d %4d %4d %d %4d %4d %4d %4d %d %2d 0x%04x %2d\n",
+ width(ind, "").c_str(),
+ m.name[0] == '\0' ? "" : width(11, m.name).c_str(),
+ m.clock,
+ m.hdisplay,
+ m.hsync_start,
+ m.hsync_end,
+ m.htotal,
+ m.hskew,
+ m.vdisplay,
+ m.vsync_start,
+ m.vsync_end,
+ m.vtotal,
+ m.vscan,
+ m.vrefresh,
+ m.flags,
+ m.type);
+}
+
+void print_property(uint64_t val, const Property& p, int ind)
+{
+ printf("%s%s (id %d) = %s\n", width(ind, "").c_str(),
+ p.name().c_str(), p.id(), p.to_str(val).c_str());
+}
+
+void print_properties(DrmObject& o, int ind)
+{
+ auto pmap = o.get_prop_map();
+ printf("%sProperties, %u in total:\n", width(ind, "").c_str(),
+ (unsigned) pmap.size());
+ for (auto pp : pmap) {
+ const Property& p = *o.card().get_prop(pp.first);
+ print_property(pp.second, p, ind + 2);
+ }
+}
+
+void print_plane(Plane& p, int ind)
+{
+ printf("%sPlane Id %d %d,%d -> %dx%d formats:", width(ind, "").c_str(),
+ p.id(), p.crtc_x(), p.crtc_y(), p.x(), p.y());
+ for (auto f : p.get_formats())
+ printf(" %s", PixelFormatToFourCC(f).c_str());
+ printf("\n");
+
+ if (opts.print_props)
+ print_properties(p, ind+2);
+}
+
+void print_crtc(Crtc& cc, int ind)
+{
+ printf("%sCRTC Id %d BufferId %d %dx%d at %dx%d gamma_size %d\n",
+ width(ind, "").c_str(), cc.id(), cc.buffer_id(), cc.width(),
+ cc.height(), cc.x(), cc.y(), cc.gamma_size());
+
+ printf("%s Mode ", width(ind, "").c_str());
+ print_mode(cc.mode(), 0);
+
+ if (opts.print_props)
+ print_properties(cc, ind+2);
+
+ if (opts.recurse)
+ for (auto p : cc.get_possible_planes())
+ print_plane(*p, ind + 2);
+}
+
+void print_encoder(Encoder& e, int ind)
+{
+ printf("%sEncoder Id %d type %s\n", width(ind, "").c_str(),
+ e.id(), e.get_encoder_type().c_str());
+
+ if (opts.print_props)
+ print_properties(e, ind+2);
+
+ if (opts.recurse)
+ for (auto cc : e.get_possible_crtcs())
+ print_crtc(*cc, ind + 2);
+}
+
+void print_connector(Connector& c, int ind)
+{
+ printf("%sConnector %s Id %d %sconnected", width(ind, "").c_str(),
+ c.fullname().c_str(), c.id(), c.connected() ? "" : "dis");
+ if (c.subpixel() != 0)
+ printf(" Subpixel: %s", c.subpixel_str().c_str());
+ printf("\n");
+
+ if (opts.print_props)
+ print_properties(c, ind+2);
+
+ if (opts.recurse)
+ for (auto enc : c.get_encoders())
+ print_encoder(*enc, ind + 2);
+
+ if (opts.print_modes) {
+ auto modes = c.get_modes();
+ printf("%sModes, %u in total:\n", width(ind + 2, "").c_str(),
+ (unsigned) modes.size());
+ for (auto mode : modes)
+ print_mode(mode, ind + 3);
+ }
+}
+
+}
+
+using namespace kmsprint;
+
+static const char* usage_str =
+ "Usage: kmsprint [OPTIONS]\n\n"
+ "Options:\n"
+ " -m, --modes Print modes\n"
+ " -p, --props Print properties\n"
+ " -r, --recurse Recursively print all related objects\n"
+ " --id=<ID> Print object <ID>\n"
+ ;
+
+static void usage()
+{
+ puts(usage_str);
+}
+
+int main(int argc, char **argv)
+{
+ string dev_path;
+ unsigned id = 0;
+
+ OptionSet optionset = {
+ Option("|device=",
+ [&](string s)
+ {
+ dev_path = s;
+ }),
+ Option("|id=",
+ [&](string s)
+ {
+ id = stoul(s);
+ }),
+ Option("p", [&](string s)
+ {
+ opts.print_props = true;
+ }),
+ Option("m", [&](string s)
+ {
+ opts.print_modes = true;
+ }),
+ Option("r", [&](string s)
+ {
+ opts.recurse = true;
+ }),
+ Option("h|help", [&]()
+ {
+ usage();
+ exit(-1);
+ }),
+ };
+
+ optionset.parse(argc, argv);
+
+ if (optionset.params().size() > 0) {
+ usage();
+ exit(-1);
+ }
+
+ Card card;
+
+ /* No options impliles recursion */
+ if (id == 0) {
+ opts.recurse = true;
+ for (auto conn : card.get_connectors())
+ print_connector(*conn, 0);
+ return 0;
+ } else {
+ auto ob = card.get_object(id);
+ if (!ob) {
+ cerr << "kmsprint" << ": Object id " <<
+ id << " not found." << endl;
+ return -1;
+ }
+
+ if (auto co = dynamic_cast<Connector*>(ob))
+ print_connector(*co, 0);
+ else if (auto en = dynamic_cast<Encoder*>(ob))
+ print_encoder(*en, 0);
+ else if (auto cr = dynamic_cast<Crtc*>(ob))
+ print_crtc(*cr, 0);
+ else if (auto pl = dynamic_cast<Plane*>(ob))
+ print_plane(*pl, 0);
+ else {
+ cerr << "kmsprint" << ": Unkown DRM Object type" <<
+ endl;
+ return -1;
+ }
+
+ return 0;
+ }
+}