/* * Copyright 2008 Tungsten Graphics * Jakob Bornecrantz * Copyright 2008 Intel Corporation * Jesse Barnes * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ /* * This fairly simple test program dumps output in a similar format to the * "xrandr" tool everyone knows & loves. It's necessarily slightly different * since the kernel separates outputs into encoder and connector structures, * each with their own unique ID. The program also allows test testing of the * memory management and mode setting APIs by allowing the user to specify a * connector and mode to use for mode setting. If all works as expected, a * blue background should be painted on the monitor attached to the specified * connector after the selected mode is set. * * TODO: use cairo to write the mode info on the selected output once * the mode has been programmed, along with possible test patterns. */ #include #include #include #include #include #include "xf86drm.h" #include "xf86drmMode.h" #include "common.h" struct type_name { unsigned int type; const char *name; }; static const char *util_lookup_type_name(unsigned int type, const struct type_name *table, unsigned int count) { unsigned int i; for (i = 0; i < count; i++) if (table[i].type == type) return table[i].name; return NULL; } static const struct type_name encoder_type_names[] = { { DRM_MODE_ENCODER_NONE, "none" }, { DRM_MODE_ENCODER_DAC, "DAC" }, { DRM_MODE_ENCODER_TMDS, "TMDS" }, { DRM_MODE_ENCODER_LVDS, "LVDS" }, { DRM_MODE_ENCODER_TVDAC, "TVDAC" }, { DRM_MODE_ENCODER_VIRTUAL, "Virtual" }, { DRM_MODE_ENCODER_DSI, "DSI" }, { DRM_MODE_ENCODER_DPMST, "DPMST" }, { DRM_MODE_ENCODER_DPI, "DPI" }, }; const char *util_lookup_encoder_type_name(unsigned int type) { return util_lookup_type_name(type, encoder_type_names, ARRAY_SIZE(encoder_type_names)); } static const struct type_name connector_status_names[] = { { DRM_MODE_CONNECTED, "connected" }, { DRM_MODE_DISCONNECTED, "disconnected" }, { DRM_MODE_UNKNOWNCONNECTION, "unknown" }, }; const char *util_lookup_connector_status_name(unsigned int status) { return util_lookup_type_name(status, connector_status_names, ARRAY_SIZE(connector_status_names)); } static const struct type_name connector_type_names[] = { { DRM_MODE_CONNECTOR_Unknown, "unknown" }, { DRM_MODE_CONNECTOR_VGA, "VGA" }, { DRM_MODE_CONNECTOR_DVII, "DVI-I" }, { DRM_MODE_CONNECTOR_DVID, "DVI-D" }, { DRM_MODE_CONNECTOR_DVIA, "DVI-A" }, { DRM_MODE_CONNECTOR_Composite, "composite" }, { DRM_MODE_CONNECTOR_SVIDEO, "s-video" }, { DRM_MODE_CONNECTOR_LVDS, "LVDS" }, { DRM_MODE_CONNECTOR_Component, "component" }, { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" }, { DRM_MODE_CONNECTOR_DisplayPort, "DP" }, { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" }, { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" }, { DRM_MODE_CONNECTOR_TV, "TV" }, { DRM_MODE_CONNECTOR_eDP, "eDP" }, { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" }, { DRM_MODE_CONNECTOR_DSI, "DSI" }, { DRM_MODE_CONNECTOR_DPI, "DPI" }, }; const char *util_lookup_connector_type_name(unsigned int type) { return util_lookup_type_name(type, connector_type_names, ARRAY_SIZE(connector_type_names)); } static const char * const modules[] = { "i915", "amdgpu", "radeon", "nouveau", "vmwgfx", "omapdrm", "exynos", "tilcdc", "msm", "sti", "tegra", "imx-drm", "rockchip", "atmel-hlcdc", "fsl-dcu-drm", "vc4", "virtio_gpu", "mediatek", "meson", "pl111", "stm", "sun4i-drm", "armada-drm", }; int util_open(const char *device, const char *module) { int fd; if (module) { fd = drmOpen(module, device); if (fd < 0) { fprintf(stderr, "failed to open device '%s': %s\n", module, strerror(errno)); return -errno; } } else { unsigned int i; for (i = 0; i < ARRAY_SIZE(modules); i++) { printf("trying to open device '%s'...", modules[i]); fd = drmOpen(modules[i], device); if (fd < 0) { printf("failed\n"); } else { printf("done\n"); break; } } if (fd < 0) { fprintf(stderr, "no device found\n"); return -ENODEV; } } return fd; }