From a6783c65943af7ff695c3769e2fd7597b9181e52 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Tue, 14 Jun 2016 17:49:06 +0200 Subject: allow to address connectors by name Signed-off-by: Philipp Zabel --- src/kmsfb-manage.c | 61 +++++++++++++++++++++++++++++++++++++++++------------- src/kmsfb.h | 1 + 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; -- cgit v1.2.3