aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2016-03-24 15:34:46 +0100
committerGerd Hoffmann <kraxel@redhat.com>2016-03-24 15:34:46 +0100
commit187097bc1722406fb62597df26308529fec6951e (patch)
treeb6ba697460281a36a1d3d2ba400165f1e63e67cf
parentd3a32431b1bd9bfd259c92df66211bff5619628d (diff)
downloadfbida-187097bc1722406fb62597df26308529fec6951e.tar.gz
drm: allow picking output
-rw-r--r--drmtools.c28
-rw-r--r--drmtools.h3
-rw-r--r--fbi.c7
-rw-r--r--fbiconfig.c8
-rw-r--r--fbiconfig.h1
5 files changed, 34 insertions, 13 deletions
diff --git a/drmtools.c b/drmtools.c
index 7de221e..b6a60ea 100644
--- a/drmtools.c
+++ b/drmtools.c
@@ -77,11 +77,12 @@ static void drm_cleanup_display(void)
}
}
-static int drm_init_dev(const char *dev)
+static int drm_init_dev(const char *dev, const char *output)
{
drmModeRes *res;
- int i, rc;
+ char name[64];
uint64_t has_dumb;
+ int i, rc;
/* open device */
fd = open(dev, O_RDWR);
@@ -106,13 +107,26 @@ static int drm_init_dev(const char *dev)
conn = drmModeGetConnector(fd, res->connectors[i]);
if (conn &&
(conn->connection == DRM_MODE_CONNECTED) &&
- conn->count_modes)
- break;
+ conn->count_modes) {
+ if (output) {
+ drm_conn_name(conn, name, sizeof(name));
+ if (strcmp(name, output) == 0) {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
drmModeFreeConnector(conn);
conn = NULL;
}
if (!conn) {
- fprintf(stderr, "drm: no usable connector found\n");
+ if (output) {
+ fprintf(stderr, "drm: output %s not found or disconnected\n",
+ output);
+ } else {
+ fprintf(stderr, "drm: no usable output found\n");
+ }
return -1;
}
mode = &conn->modes[0];
@@ -186,7 +200,7 @@ static void drm_restore_display(void)
drm_show_fb();
}
-gfxstate *drm_init(const char *device)
+gfxstate *drm_init(const char *device, const char *output)
{
gfxstate *gfx;
char dev[64];
@@ -198,7 +212,7 @@ gfxstate *drm_init(const char *device)
}
fprintf(stderr, "trying drm: %s ...\n", dev);
- if (drm_init_dev(dev) < 0)
+ if (drm_init_dev(dev, output) < 0)
return NULL;
if (drm_init_fb() < 0)
return NULL;
diff --git a/drmtools.h b/drmtools.h
index 0e01ff2..3c733a6 100644
--- a/drmtools.h
+++ b/drmtools.h
@@ -1,3 +1,2 @@
-gfxstate *drm_init(const char *dev);
+gfxstate *drm_init(const char *device, const char *output);
void drm_info(const char *device);
-
diff --git a/fbi.c b/fbi.c
index c7d84b0..1500614 100644
--- a/fbi.c
+++ b/fbi.c
@@ -1435,7 +1435,7 @@ int main(int argc, char *argv[])
int once;
int i, arg, key;
bool framebuffer = false;
- char *info, *desc, *filelist, *device, *mode;
+ char *info, *desc, *filelist, *device, *output, *mode;
char linebuffer[128];
struct flist *fprev = NULL;
@@ -1520,18 +1520,19 @@ int main(int argc, char *argv[])
/* gfx device init */
device = cfg_get_str(O_DEVICE);
+ output = cfg_get_str(O_OUTPUT);
mode = cfg_get_str(O_VIDEO_MODE);
if (device) {
/* device specified */
if (strncmp(device, "/dev/d", 6) == 0) {
- gfx = drm_init(device);
+ gfx = drm_init(device, output);
} else {
framebuffer = true;
gfx = fb_init(device, mode, GET_VT());
}
} else {
/* try drm first, failing that fb */
- gfx = drm_init(NULL);
+ gfx = drm_init(NULL, output);
if (!gfx) {
framebuffer = true;
gfx = fb_init(NULL, mode, GET_VT());
diff --git a/fbiconfig.c b/fbiconfig.c
index 8a82331..f67850b 100644
--- a/fbiconfig.c
+++ b/fbiconfig.c
@@ -163,7 +163,13 @@ struct cfg_cmdline fbi_cfg[] = {
.cmdline = "device",
.option = { O_DEVICE },
.needsarg = 1,
- .desc = "use framebuffer device <arg>",
+ .desc = "use framebuffer/drm device <arg>",
+ },{
+ .letter = 'o',
+ .cmdline = "output",
+ .option = { O_OUTPUT },
+ .needsarg = 1,
+ .desc = "use drm output <arg> (try -info for a list)",
},{
.letter = 'm',
.cmdline = "mode",
diff --git a/fbiconfig.h b/fbiconfig.h
index 048735b..9a8c058 100644
--- a/fbiconfig.h
+++ b/fbiconfig.h
@@ -32,6 +32,7 @@
#define O_PCD_RES O_OPTIONS, "photocd-res"
#define O_DEVICE O_OPTIONS, "device"
+#define O_OUTPUT O_OPTIONS, "output"
#define O_FONT O_OPTIONS, "font"
#define O_VIDEO_MODE O_OPTIONS, "video-mode"