From 8d7bb3e204e85d0c4e21f6fd2757ae2bb5073b6c Mon Sep 17 00:00:00 2001 From: Jianlong Huang Date: Wed, 10 Aug 2022 14:09:56 +0800 Subject: [PATCH] starfive: v4l2test: Support select connector to display for drm Add -C param to select connector 0---inno hdmi 1---rgb hdmi or mipi dsi Signed-off-by: Jianlong Huang --- package/starfive/v4l2_test/stf_drm.c | 15 +++++++++++++-- package/starfive/v4l2_test/stf_drm.h | 1 + package/starfive/v4l2_test/v4l2_test.c | 18 +++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/package/starfive/v4l2_test/stf_drm.c b/package/starfive/v4l2_test/stf_drm.c index 7f1c28dd..1ee2b35f 100755 --- a/package/starfive/v4l2_test/stf_drm.c +++ b/package/starfive/v4l2_test/stf_drm.c @@ -107,8 +107,8 @@ static struct drm_dev_t *drm_find_dev(int fd, uint32_t width, uint32_t height) /* FIXME: use default encoder/crtc pair */ if ((enc = drmModeGetEncoder(fd, dev->enc_id)) == NULL) fatal("drmModeGetEncoder() faild"); - if (enc->crtc_id) { - dev->crtc_id = enc->crtc_id; + if (enc->possible_clones == 2) { + dev->crtc_id = res->crtcs[1]; } else { dev->crtc_id = res->crtcs[0]; } @@ -425,6 +425,16 @@ static void drm_destroy(int fd, struct drm_dev_t *dev_head) drmClose(fd); LOG(STF_LEVEL_TRACE, "Exit\n"); } +static struct drm_dev_t *drm_find_connector(DRMParam_t *param, drm_dev_t *dev) +{ + drm_dev_t *tmp_dev = NULL; + + for (tmp_dev = dev; tmp_dev != NULL; tmp_dev = dev->next) { + if (param->connector_id == tmp_dev->conn_id && param->connector_id != 0) + return tmp_dev; + } + return dev; +} void stf_drm_open(DRMParam_t *param, char *device_name, int iomthd) { @@ -458,6 +468,7 @@ void stf_drm_init(DRMParam_t *param, uint32_t width, uint32_t height, exit (EXIT_FAILURE); } + dev_head = drm_find_connector(param, dev_head); dev_head->drm_format = v4l2fmt_to_drmfmt(v4l2_fmt); if (IO_METHOD_MMAP == iomthd) { diff --git a/package/starfive/v4l2_test/stf_drm.h b/package/starfive/v4l2_test/stf_drm.h index 081d3f4e..5345a6e9 100644 --- a/package/starfive/v4l2_test/stf_drm.h +++ b/package/starfive/v4l2_test/stf_drm.h @@ -37,6 +37,7 @@ typedef struct drm_dev_t { typedef struct DRMParam_t { drm_dev_t* dev_head; int fd; + int connector_id; } DRMParam_t; diff --git a/package/starfive/v4l2_test/v4l2_test.c b/package/starfive/v4l2_test/v4l2_test.c index a3315a18..f680b1ed 100644 --- a/package/starfive/v4l2_test/v4l2_test.c +++ b/package/starfive/v4l2_test/v4l2_test.c @@ -21,6 +21,8 @@ #define STFBC_DEVICE_NAME "/dev/stfbcdev" #define DRM_DEVICE_NAME "/dev/dri/card0" #define V4L2_DFT_DEVICE_NAME "/dev/video0" +#define INNO_HDMI_CONNECTOR_ID 116 +#define MIPI_RGB_CONNECTOR_ID 118 typedef struct enum_value_t { int value; @@ -93,6 +95,7 @@ static void alloc_default_config(ConfigParam_t **pp_data) cfg_param->fb_param.bpp = 16; cfg_param->fb_param.screen_size = cfg_param->fb_param.width * cfg_param->fb_param.height * cfg_param->fb_param.bpp / 8; + cfg_param->drm_param.connector_id = 0; *pp_data = cfg_param; } @@ -735,6 +738,9 @@ static void usage(FILE* fp, int argc, char** argv) "-D | --down Set v4l2 image crop y height\n" "-I | --interval Set frame interval (fps) (-1 to skip)\n" "-c | --continuous Do continous capture, stop with SIGINT.\n" + "-C | --connector Display Connector.\n" + " 0: INNO HDMI\n" + " 1: MIPI/RGB HDMI\n" "-v | --version Print version\n" "-f | --format image format, default 5\n" " 0: V4L2_PIX_FMT_RGB565\n" @@ -767,7 +773,7 @@ static void usage(FILE* fp, int argc, char** argv) argv[0]); } -static const char short_options [] = "d:ho:q:m:W:H:I:vcf:t:X:Y:R:D:l:s"; +static const char short_options [] = "d:ho:q:m:W:H:I:vcf:t:X:Y:R:D:l:C:s"; static const struct option long_options [] = { { "device", required_argument, NULL, 'd' }, @@ -787,6 +793,7 @@ static const struct option long_options [] = { { "format", required_argument, NULL, 'f' }, { "distype", required_argument, NULL, 't' }, { "loadfw", required_argument, NULL, 'l' }, + { "connector", required_argument, NULL, 'C' }, { "g_imagesize",no_argument, NULL, 's' }, { 0, 0, 0, 0 } }; @@ -945,6 +952,15 @@ void parse_options(int argc, char **argv, ConfigParam_t *cfg_param) sensor_image_size_info(&(cfg_param->v4l2_param)); exit(EXIT_SUCCESS); break; + + case 'C': + value = atoi(optarg); + if (value == 0) + cfg_param->drm_param.connector_id = INNO_HDMI_CONNECTOR_ID; + else + cfg_param->drm_param.connector_id = MIPI_RGB_CONNECTOR_ID; + break; + default: usage(stderr, argc, argv); exit(EXIT_FAILURE);