summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2016-06-14 17:49:06 +0200
committerPhilipp Zabel <p.zabel@pengutronix.de>2016-06-14 17:50:34 +0200
commita6783c65943af7ff695c3769e2fd7597b9181e52 (patch)
tree2edbfe407e9514b6cdc02776956827769dff9619
parentd96d5ef1f51e12f44c9c818d36e9742662d78502 (diff)
downloadkmsfbwrap-a6783c65943af7ff695c3769e2fd7597b9181e52.tar.gz
kmsfbwrap-a6783c65943af7ff695c3769e2fd7597b9181e52.tar.xz
allow to address connectors by name
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--src/kmsfb-manage.c61
-rw-r--r--src/kmsfb.h1
2 files changed, 48 insertions, 14 deletions
diff --git a/src/kmsfb-manage.c b/src/kmsfb-manage.c
index 84eee8b..82eeb57 100644
--- a/src/kmsfb-manage.c
+++ b/src/kmsfb-manage.c
@@ -45,6 +45,7 @@ struct drm_connector {
uint32_t id;
int encoder_id;
int type;
+ int type_id;
struct drm_mode_modeinfo *modes;
int num_modes;
uint64_t *prop_values;
@@ -180,9 +181,15 @@ static int kms_data_val_set(struct kms_data *kd, const char *key, const char *va
kd->crtc = strtoul(value, NULL, 0);
else if (!strcmp(key, "plane"))
kd->plane = strtoul(value, NULL, 0);
- else if (!strcmp(key, "connector"))
- kd->connector = strtoul(value, NULL, 0);
- else if (!strcmp(key, "encoder"))
+ else if (!strcmp(key, "connector")) {
+ char *end;
+
+ kd->connector = strtoul(value, &end, 0);
+ if (end == value) {
+ kd->connector_name = value;
+ kd->connector = 0;
+ }
+ } else if (!strcmp(key, "encoder"))
kd->encoder = strtoul(value, NULL, 0);
else if (!strcmp(key, "3d"))
kd->triplebuf = 1;
@@ -263,13 +270,19 @@ static int parse_key_value(const char *str, struct kms_data *kd)
return 0;
}
-static struct drm_connector *drm_find_connector(struct drm_resource *res, int con_id)
+static const char *drm_connector_name(struct drm_connector *con);
+
+static struct drm_connector *drm_find_connector(struct drm_resource *res,
+ int con_id, const char *con_name)
{
int i;
- for (i = 0; i < res->num_connectors; i++)
- if ((!con_id && res->connectors[i].num_modes > 0) || res->connectors[i].id == con_id)
+ for (i = 0; i < res->num_connectors; i++) {
+ if ((!con_id && !con_name && res->connectors[i].num_modes > 0) ||
+ (con_id && (res->connectors[i].id == con_id)) ||
+ (con_name && (strcasecmp(drm_connector_name(&res->connectors[i]), con_name) == 0)))
return &res->connectors[i];
+ }
return NULL;
}
@@ -382,6 +395,16 @@ static char *connector_type_strings[] = {
#endif
};
+static const char *drm_connector_name(struct drm_connector *con)
+{
+ static char name[DRM_CONNECTOR_NAME_LEN];
+
+ snprintf(name, DRM_CONNECTOR_NAME_LEN, "%s-%u",
+ connector_type_strings[con->type], con->type_id);
+
+ return name;
+}
+
static void *memdup(void *src, size_t size)
{
void *dest;
@@ -548,6 +571,7 @@ static int drm_mode_get_connector(int fd, int id, struct drm_connector *drmcon)
drmcon->num_modes = conn.count_modes;
drmcon->encoder_id = conn.encoder_id;
drmcon->type = conn.connector_type;
+ drmcon->type_id = conn.connector_type_id;
drmcon->modes = U642VOID(conn.modes_ptr);
drmcon->num_modes = conn.count_modes;
@@ -1034,13 +1058,21 @@ static int create_window(struct drm_resource *res, const char *in)
return ret;
}
- drmcon = drm_find_connector(res, kd.connector);
+ drmcon = drm_find_connector(res, kd.connector, kd.connector_name);
if (!drmcon) {
- printf("specified connector %d does not exist\n", kd.connector);
+ if (kd.connector) {
+ printf("specified connector %d does not exist\n",
+ kd.connector);
+ } else if (kd.connector_name) {
+ printf("specified connector '%s' does not exist\n",
+ kd.connector_name);
+ }
return -1;
}
- if (!kd.connector)
- print("using connector %d\n", drmcon->id);
+ if (!kd.connector && !kd.connector_name) {
+ print("using connector %d (%s)\n", drmcon->id,
+ drm_connector_name(drmcon));
+ }
kd.connector = drmcon->id;
if (!kd.encoder) {
@@ -1090,15 +1122,15 @@ static int create_window(struct drm_resource *res, const char *in)
}
if (kd.xres == 0 || kd.yres == 0) {
- print("selected mode for connector %d: %dx%d\n", drmcon->id,
- mode->hdisplay, mode->vdisplay);
+ print("selected mode for connector %d (%s): %dx%d\n", drmcon->id,
+ drm_connector_name(drmcon), mode->hdisplay, mode->vdisplay);
kd.xres = mode->hdisplay;
kd.yres = mode->vdisplay;
}
if (!kd.kms_fb) {
- pr_err("no framebuffer assigned to connector %d\n",
- kd.connector);
+ pr_err("no framebuffer assigned to connector %d (%s)\n",
+ kd.connector, drm_connector_name(drmcon));
}
if (kd.kms_fb->xres == 0 || kd.kms_fb->yres == 0) {
kd.kms_fb->xres = kd.xres;
@@ -1229,6 +1261,7 @@ static void dump_resource(int fd, struct drm_resource *res)
struct drm_connector *con = &res->connectors[i];
printf("\tid %d\n", con->id);
printf("\t\tcurrent encoder: %d\n", con->encoder_id);
+ printf("\t\tname: %s\n", drm_connector_name(con));
printf("\t\ttype: %s\n", connector_type_strings[con->type]);
for (j = 0; j < con->num_modes; j++) {
struct drm_mode_modeinfo *mode = &con->modes[j];
diff --git a/src/kmsfb.h b/src/kmsfb.h
index b96a665..3cdc2c1 100644
--- a/src/kmsfb.h
+++ b/src/kmsfb.h
@@ -95,6 +95,7 @@ struct kms_data {
uint32_t crtc;
uint32_t plane;
uint32_t connector;
+ const char *connector_name;
uint32_t encoder;
struct kms_fb *kms_fb;