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 <jianlong.huang@starfivetech.com>
This commit is contained in:
Jianlong Huang
2022-08-10 14:09:56 +08:00
parent 8975760f59
commit 8d7bb3e204
3 changed files with 31 additions and 3 deletions
+13 -2
View File
@@ -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) {
+1
View File
@@ -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;
+17 -1
View File
@@ -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);