summaryrefslogtreecommitdiff
path: root/v4l2-apps/util
diff options
context:
space:
mode:
Diffstat (limited to 'v4l2-apps/util')
-rw-r--r--v4l2-apps/util/v4l2-ctl.cpp98
-rw-r--r--v4l2-apps/util/v4l2-dbg-micron.h46
-rw-r--r--v4l2-apps/util/v4l2-dbg.cpp19
-rw-r--r--v4l2-apps/util/v4l2-sysfs-path.c129
-rw-r--r--v4l2-apps/util/xc3028-firmware/firmware-tool.c4
5 files changed, 269 insertions, 27 deletions
diff --git a/v4l2-apps/util/v4l2-ctl.cpp b/v4l2-apps/util/v4l2-ctl.cpp
index 898c88cb7..60ebc5474 100644
--- a/v4l2-apps/util/v4l2-ctl.cpp
+++ b/v4l2-apps/util/v4l2-ctl.cpp
@@ -136,6 +136,8 @@ enum Option {
OptGetModulator,
OptSetModulator,
OptListDevices,
+ OptGetOutputParm,
+ OptSetOutputParm,
OptLast = 256
};
@@ -226,6 +228,8 @@ static struct option long_options[] = {
{"set-standard", required_argument, 0, OptSetStandard},
{"get-parm", no_argument, 0, OptGetParm},
{"set-parm", required_argument, 0, OptSetParm},
+ {"get-output-parm", no_argument, 0, OptGetOutputParm},
+ {"set-output-parm", required_argument, 0, OptSetOutputParm},
{"info", no_argument, 0, OptGetDriverInfo},
{"list-ctrls", no_argument, 0, OptListCtrls},
{"list-ctrls-menus", no_argument, 0, OptListCtrlsMenus},
@@ -310,8 +314,9 @@ static void usage(void)
" ntsc-X (X = M/J/K) or just 'ntsc' (V4L2_STD_NTSC)\n"
" secam-X (X = B/G/H/D/K/L/Lc) or just 'secam' (V4L2_STD_SECAM)\n"
" --list-standards display supported video standards [VIDIOC_ENUMSTD]\n"
- " -P, --get-parm display video parameters [VIDIOC_G_PARMS]\n"
- " -p, --set-parm set video rate in fps [VIDIOC_S_PARMS]\n"
+ " -P, --get-parm display video parameters [VIDIOC_G_PARM]\n"
+ " -p, --set-parm=<fps>\n"
+ " set video framerate in <fps> [VIDIOC_S_PARM]\n"
" -T, --get-tuner query the tuner settings [VIDIOC_G_TUNER]\n"
" -t, --set-tuner=<mode>\n"
" set the audio mode of the tuner [VIDIOC_S_TUNER]\n"
@@ -424,6 +429,9 @@ static void usage(void)
" bilingual: Modulate as bilingual\n"
" mono-sap: Modulate as mono with Second Audio Program\n"
" stereo-sap: Modulate as stereo with Second Audio Program\n"
+ " --get-output-parm display output video parameters [VIDIOC_G_PARM]\n"
+ " --set-output-parm=<fps>\n"
+ " set output video framerate in <fps> [VIDIOC_S_PARM]\n"
"\n");
printf("Expert options:\n"
" --streamoff turn the stream off [VIDIOC_STREAMOFF]\n"
@@ -830,7 +838,7 @@ static void printcropcap(const struct v4l2_cropcap &cropcap)
printf("\tPixel Aspect: %u/%u\n", cropcap.pixelaspect.numerator, cropcap.pixelaspect.denominator);
}
-static void printfmt(struct v4l2_format vfmt)
+static void printfmt(const struct v4l2_format &vfmt)
{
const flag_def vbi_def[] = {
{ V4L2_VBI_UNSYNC, "unsynchronized" },
@@ -1431,7 +1439,8 @@ int main(int argc, char **argv)
int txsubchans; /* set_modulator */
v4l2_std_id std; /* get_std/set_std */
double freq = 0; /* get/set frequency */
- double fps = 0; /* set framerate speed, in fps */
+ double fps = 0; /* set framerate speed, in fps */
+ double output_fps = 0; /* set framerate speed, in fps */
struct v4l2_frequency vf; /* get_freq/set_freq */
struct v4l2_standard vs; /* list_std */
int overlay; /* overlay */
@@ -1701,6 +1710,9 @@ int main(int argc, char **argv)
case OptSetParm:
fps = strtod(optarg, NULL);
break;
+ case OptSetOutputParm:
+ output_fps = strtod(optarg, NULL);
+ break;
case OptGetCtrl:
subs = optarg;
while (*subs != '\0') {
@@ -1927,6 +1939,7 @@ int main(int argc, char **argv)
options[OptGetAudioOutput] = 1;
options[OptGetStandard] = 1;
options[OptGetParm] = 1;
+ options[OptGetOutputParm] = 1;
options[OptGetFreq] = 1;
options[OptGetTuner] = 1;
options[OptGetModulator] = 1;
@@ -1990,18 +2003,38 @@ int main(int argc, char **argv)
if (options[OptSetParm]) {
- memset (&parm, 0, sizeof(parm));
+ memset(&parm, 0, sizeof(parm));
parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
parm.parm.capture.timeperframe.numerator = 1000;
- parm.parm.capture.timeperframe.denominator = (__u32)(fps * parm.parm.capture.timeperframe.numerator);
+ parm.parm.capture.timeperframe.denominator =
+ fps * parm.parm.capture.timeperframe.numerator;
if (doioctl(fd, VIDIOC_S_PARM, &parm, "VIDIOC_S_PARM") == 0) {
struct v4l2_fract *tf = &parm.parm.capture.timeperframe;
+
if (!tf->denominator || !tf->numerator)
- printf ("Invalid frame rate\n");
+ printf("Invalid frame rate\n");
else
- printf("Frame rate set to: %.3f fps\n",
- 1.0*tf->denominator/tf->numerator);
+ printf("Frame rate set to %.3f fps\n",
+ 1.0 * tf->denominator / tf->numerator);
+ }
+ }
+
+ if (options[OptSetOutputParm]) {
+ memset(&parm, 0, sizeof(parm));
+ parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+ parm.parm.output.timeperframe.numerator = 1000;
+ parm.parm.output.timeperframe.denominator =
+ fps * parm.parm.output.timeperframe.numerator;
+
+ if (doioctl(fd, VIDIOC_S_PARM, &parm, "VIDIOC_S_PARM") == 0) {
+ struct v4l2_fract *tf = &parm.parm.output.timeperframe;
+
+ if (!tf->denominator || !tf->numerator)
+ printf("Invalid frame rate\n");
+ else
+ printf("Frame rate set to %.3f fps\n",
+ 1.0 * tf->denominator / tf->numerator);
}
}
@@ -2481,19 +2514,46 @@ set_vid_fmt_error:
}
if (options[OptGetParm]) {
- memset (&parm, 0, sizeof(parm));
+ memset(&parm, 0, sizeof(parm));
parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (doioctl(fd, VIDIOC_G_PARM, &parm, "VIDIOC_G_PARM") == 0) {
- struct v4l2_fract *tf = &parm.parm.capture.timeperframe;
- if (parm.parm.capture.capability & V4L2_MODE_HIGHQUALITY)
- printf("Has High quality imaging mode\n");
- if (parm.parm.capture.capability && V4L2_CAP_TIMEPERFRAME)
- printf("Has V4L2_CAP_TIMEPERFRAME\n");
- if (!tf->denominator || !tf->numerator)
- printf ("Invalid frame rate\n");
+ const struct v4l2_fract &tf = parm.parm.capture.timeperframe;
+
+ printf("Streaming Parameters %s:\n", buftype2s(parm.type).c_str());
+ if (parm.parm.capture.capability & V4L2_CAP_TIMEPERFRAME)
+ printf("\tCapabilities : timeperframe\n");
+ if (parm.parm.capture.capturemode & V4L2_MODE_HIGHQUALITY)
+ printf("\tCapture mode : high quality\n");
+ if (!tf.denominator || !tf.numerator)
+ printf("\tFrames per second: invalid (%d/%d)\n",
+ tf.denominator, tf.numerator);
+ else
+ printf("\tFrames per second: %.3f (%d/%d)\n",
+ (1.0 * tf.denominator) / tf.numerator,
+ tf.denominator, tf.numerator);
+ printf("\tRead buffers : %d\n", parm.parm.output.writebuffers);
+ }
+ }
+
+ if (options[OptGetOutputParm]) {
+ memset(&parm, 0, sizeof(parm));
+ parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+ if (doioctl(fd, VIDIOC_G_PARM, &parm, "VIDIOC_G_PARM") == 0) {
+ const struct v4l2_fract &tf = parm.parm.output.timeperframe;
+
+ printf("Streaming Parameters %s:\n", buftype2s(parm.type).c_str());
+ if (parm.parm.output.capability & V4L2_CAP_TIMEPERFRAME)
+ printf("\tCapabilities : timeperframe\n");
+ if (parm.parm.output.outputmode & V4L2_MODE_HIGHQUALITY)
+ printf("\tOutput mode : high quality\n");
+ if (!tf.denominator || !tf.numerator)
+ printf("\tFrames per second: invalid (%d/%d)\n",
+ tf.denominator, tf.numerator);
else
- printf("Frame rate is %.3f fps\n",
- (1.0 * tf->denominator) / tf->numerator);
+ printf("\tFrames per second: %.3f (%d/%d)\n",
+ (1.0 * tf.denominator) / tf.numerator,
+ tf.denominator, tf.numerator);
+ printf("\tWrite buffers : %d\n", parm.parm.output.writebuffers);
}
}
diff --git a/v4l2-apps/util/v4l2-dbg-micron.h b/v4l2-apps/util/v4l2-dbg-micron.h
new file mode 100644
index 000000000..8466322bf
--- /dev/null
+++ b/v4l2-apps/util/v4l2-dbg-micron.h
@@ -0,0 +1,46 @@
+/*
+ Copyright (C) 2009 Mauro Carvalho Chehab <mchehab@infradead.org>
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "v4l2-dbg.h"
+
+#define MT9V011_IDENT "mt9v011"
+
+/* Register name prefix */
+#define MT9V011_PREFIX "MT9V011_"
+
+static struct board_regs mt9v011_regs[] = {
+ {0x00, MT9V011_PREFIX "CHIP_VERSION"},
+ {0x01, MT9V011_PREFIX "ROWSTART"},
+ {0x02, MT9V011_PREFIX "COLSTART"},
+ {0x03, MT9V011_PREFIX "HEIGHT"},
+ {0x04, MT9V011_PREFIX "WIDTH"},
+ {0x05, MT9V011_PREFIX "HBLANK"},
+ {0x06, MT9V011_PREFIX "VBLANK"},
+ {0x07, MT9V011_PREFIX "OUT_CTRL"},
+ {0x09, MT9V011_PREFIX "SHUTTER_WIDTH"},
+ {0x0a, MT9V011_PREFIX "CLK_SPEED"},
+ {0x0b, MT9V011_PREFIX "RESTART"},
+ {0x0c, MT9V011_PREFIX "SHUTTER_DELAY"},
+ {0x0d, MT9V011_PREFIX "RESET"},
+ {0x1e, MT9V011_PREFIX "DIGITAL_ZOOM"},
+ {0x20, MT9V011_PREFIX "READ_MODE"},
+ {0x2b, MT9V011_PREFIX "GREEN_1_GAIN"},
+ {0x2c, MT9V011_PREFIX "BLUE_GAIN"},
+ {0x2d, MT9V011_PREFIX "RED_GAIN"},
+ {0x2e, MT9V011_PREFIX "GREEN_2_GAIN"},
+ {0x35, MT9V011_PREFIX "GLOBAL_GAIN"},
+ {0xf1, MT9V011_PREFIX "CHIP_ENABLE"},
+};
diff --git a/v4l2-apps/util/v4l2-dbg.cpp b/v4l2-apps/util/v4l2-dbg.cpp
index 424b0fffe..1a481c04c 100644
--- a/v4l2-apps/util/v4l2-dbg.cpp
+++ b/v4l2-apps/util/v4l2-dbg.cpp
@@ -47,6 +47,7 @@
#include "v4l2-dbg-em28xx.h"
#include "v4l2-dbg-ac97.h"
#include "v4l2-dbg-tvp5150.h"
+#include "v4l2-dbg-micron.h"
#define ARRAY_SIZE(arr) ((int)(sizeof(arr) / sizeof((arr)[0])))
@@ -61,7 +62,7 @@ struct board_list {
static const struct board_list boards[] = {
#define AC97_BOARD 0
- { /* From ac97-dbg.h */
+ { /* From v4l2-dbg-ac97.h */
AC97_IDENT,
sizeof(AC97_PREFIX) - 1,
ac97_regs,
@@ -69,7 +70,7 @@ static const struct board_list boards[] = {
NULL,
0,
},
- { /* From bttv-dbg.h */
+ { /* From v4l2-dbg-bttv.h */
BTTV_IDENT,
sizeof(BTTV_PREFIX) - 1,
bt8xx_regs,
@@ -77,7 +78,7 @@ static const struct board_list boards[] = {
bt8xx_regs_other,
ARRAY_SIZE(bt8xx_regs_other),
},
- { /* From saa7134-dbg.h */
+ { /* From v4l2-dbg-saa7134.h */
SAA7134_IDENT,
sizeof(SAA7134_PREFIX) - 1,
saa7134_regs,
@@ -85,7 +86,7 @@ static const struct board_list boards[] = {
NULL,
0,
},
- { /* From em28xx-dbg.h */
+ { /* From v4l2-dbg-em28xx.h */
EM28XX_IDENT,
sizeof(EM28XX_PREFIX) - 1,
em28xx_regs,
@@ -93,7 +94,7 @@ static const struct board_list boards[] = {
em28xx_alt_regs,
ARRAY_SIZE(em28xx_alt_regs),
},
- { /* From tvp5150-dbg.h */
+ { /* From v4l2-dbg-tvp5150.h */
TVP5150_IDENT,
sizeof(TVP5150_PREFIX) - 1,
tvp5150_regs,
@@ -101,6 +102,14 @@ static const struct board_list boards[] = {
NULL,
0,
},
+ { /* From v4l2-dbg-micron.h */
+ MT9V011_IDENT,
+ sizeof(MT9V011_PREFIX) - 1,
+ mt9v011_regs,
+ ARRAY_SIZE(mt9v011_regs),
+ NULL,
+ 0,
+ },
};
struct chipid {
diff --git a/v4l2-apps/util/v4l2-sysfs-path.c b/v4l2-apps/util/v4l2-sysfs-path.c
index e3f3e63e8..2a6ab0cfc 100644
--- a/v4l2-apps/util/v4l2-sysfs-path.c
+++ b/v4l2-apps/util/v4l2-sysfs-path.c
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <string.h>
#include <dirent.h>
+#include <sys/stat.h>
#define USB_ID "usb-"
#define PCI_ID "PCI:"
@@ -135,6 +136,130 @@ err:
return NULL;
}
+char *seek_name(char *path, char *match)
+{
+ DIR *dir;
+ struct dirent *entry;
+ struct stat st;
+ char *p;
+ static char name[1024];
+ int major, minor;
+
+ dir = opendir(path);
+ if (!dir)
+ return NULL;
+
+ strcpy(name, path);
+ strcat(name, "/");
+ p = name + strlen(name);
+
+ entry = readdir(dir);
+ while (entry) {
+ if (!strncmp(entry->d_name, match, strlen(match))) {
+
+ strcpy(name, entry->d_name);
+ closedir(dir);
+ return name;
+ }
+ entry = readdir(dir);
+ }
+ closedir(dir);
+ return NULL;
+}
+
+int get_dev(char *class, int *major, int *minor, char *extra)
+{
+ char path[1024];
+ char *name;
+ FILE *fp;
+
+ name = strchr(class,':');
+ if (!name)
+ return -1;
+ *name = 0;
+ name++;
+
+ *extra = 0;
+
+ if (!strcmp(class, "input")) {
+ char *event;
+
+ sprintf(path, "/sys/class/%s/%s/", class, name);
+ event = seek_name(path, "event");
+ if (!event)
+ return -1;
+
+ strcpy(extra, event);
+
+ sprintf(path, "/sys/class/%s/%s/%s/dev", class, name, event);
+
+ } else
+ sprintf(path, "/sys/class/%s/%s/dev", class, name);
+
+ fp = fopen(path, "r");
+ if (!fp)
+ return -1;
+
+ fscanf(fp, "%d:%d", major, minor);
+
+ return 0;
+}
+
+/*
+ Examples of subdevs:
+ sound:audio1
+ sound:controlC1
+ sound:dsp1
+ sound:mixer1
+ sound:pcmC1D0c
+ dvb:dvb0.demux0
+ dvb:dvb0.dvr0
+ dvb:dvb0.frontend0
+ dvb:dvb0.net0
+ i2c-adapter:i2c-4
+ input:input8
+*/
+
+void get_subdevs(char *path)
+{
+ DIR *dir;
+ struct dirent *entry;
+ struct stat st;
+ char *p, name[1024], extra[20];
+ int major, minor;
+
+ dir = opendir(path);
+ if (!dir)
+ return;
+
+ strcpy(name, path);
+ strcat(name, "/");
+ p = name + strlen(name);
+
+ printf("Associated devices:\n");
+ entry = readdir(dir);
+ while (entry) {
+ strcpy(p, entry->d_name);
+ if ((lstat(name, &st) == 0) &&
+ !S_ISDIR(st.st_mode)) {
+ char *s = strchr(entry->d_name, ':');
+ if (s) {
+ printf("\t%s", entry->d_name);
+ if (!get_dev(entry->d_name, &major, &minor, extra))
+ if (*extra)
+ printf(":%s (dev %d,%d)",
+ extra, major, minor);
+ else
+ printf(" (dev %d,%d)",
+ major, minor);
+ printf("\n");
+ }
+ }
+ entry = readdir(dir);
+ }
+ closedir(dir);
+}
+
void get_sysfs(char *fname)
{
struct v4l2_driver drv;
@@ -148,9 +273,11 @@ void get_sysfs(char *fname)
printf("bus info = %s\n", drv.cap.bus_info);
path = obtain_bus_sysfs_path((char *)drv.cap.bus_info);
if (path) {
- printf("sysfs path = %s\n\n", path);
+ printf("sysfs path = %s\n", path);
+ get_subdevs(path);
free(path);
}
+ printf("\n");
v4l2_close(&drv);
}
diff --git a/v4l2-apps/util/xc3028-firmware/firmware-tool.c b/v4l2-apps/util/xc3028-firmware/firmware-tool.c
index de1262ceb..43b78df7e 100644
--- a/v4l2-apps/util/xc3028-firmware/firmware-tool.c
+++ b/v4l2-apps/util/xc3028-firmware/firmware-tool.c
@@ -33,8 +33,8 @@
#include <asm/byteorder.h>
#include <asm/types.h>
-#include "../../../linux/drivers/media/video/tuner-xc2028-types.h"
-#include "../../../linux/include/linux/videodev2.h"
+#include "../../../linux/drivers/media/common/tuners/tuner-xc2028-types.h"
+#include "linux/videodev2.h"
#include "extract_head.h"
#include "standards.h"