diff options
| author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2016-05-23 09:54:08 +0300 | 
|---|---|---|
| committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2016-05-23 09:54:08 +0300 | 
| commit | a5c28bcb2ead34e921617711ebf94ffcb5d72878 (patch) | |
| tree | e2f93259f63407357c70b06a7d59c24fde5a3901 /utils/kmsprint.cpp | |
| parent | 0bc5bbd6766949d651f98e12981d79c86ce0bf99 (diff) | |
File/dir renames
Diffstat (limited to 'utils/kmsprint.cpp')
| -rw-r--r-- | utils/kmsprint.cpp | 221 | 
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; +	} +} | 
