external/drm_framebuffer
Revision | 47e12d832a8c97896bef6b00839a83d59266cd63 (tree) |
---|---|
Zeit | 2020-03-13 20:33:56 |
Autor | Chih-Wei Huang <cwhuang@linu...> |
Commiter | Chih-Wei Huang |
Allow to force mode by a property
The desired resolution could be set by property debug.drm.mode.force.
@@ -26,6 +26,7 @@ | ||
26 | 26 | #include <string.h> |
27 | 27 | #include <errno.h> |
28 | 28 | #include <fcntl.h> |
29 | +#include <cutils/properties.h> | |
29 | 30 | #include <hardware/gralloc.h> |
30 | 31 | #include <log/log.h> |
31 | 32 |
@@ -90,10 +91,27 @@ static drmModeModeInfoPtr fb0_find_preferred_mode(drmModeConnectorPtr connector) | ||
90 | 91 | { |
91 | 92 | int i; |
92 | 93 | drmModeModeInfoPtr mode = NULL; |
94 | + char value[PROPERTY_VALUE_MAX]; | |
95 | + uint32_t xres = 0, yres = 0, rate = 0; | |
96 | + if (property_get("debug.drm.mode.force", value, NULL)) { | |
97 | + /* parse <xres>x<yres>[@<refreshrate>] */ | |
98 | + if (sscanf(value, "%dx%d@%d", &xres, &yres, &rate) != 3) { | |
99 | + rate = 0; | |
100 | + if (sscanf(value, "%dx%d", &xres, &yres) != 2) { | |
101 | + xres = yres = 0; | |
102 | + } | |
103 | + } | |
104 | + ALOGI_IF(xres && yres, "force mode to %dx%d@%dHz", xres, yres, rate); | |
105 | + } | |
93 | 106 | |
94 | 107 | for (i = 0; i < connector->count_modes; ++i) { |
95 | 108 | mode = &connector->modes[i]; |
96 | - if (mode->type & DRM_MODE_TYPE_PREFERRED) { | |
109 | + if (xres && yres) { | |
110 | + if (mode->hdisplay == xres && mode->vdisplay == yres && | |
111 | + (!rate || mode->vrefresh == rate)) { | |
112 | + break; | |
113 | + } | |
114 | + } else if (mode->type & DRM_MODE_TYPE_PREFERRED) { | |
97 | 115 | break; |
98 | 116 | } |
99 | 117 | } |