Hi,
On Saturday 29 October 2011 09:30:04 Alexey Fisher wrote:
> Am 28.10.2011 18:01, schrieb cheshirekow:
> > On Sun, 2011-10-23 at 13:50 -0400, cheshirekow wrote:
> >> On 10/22/2011 03:16 AM, Alexey Fisher wrote:
> >>> Can you please attach the output of this command:
> >>> lsusb -vd 10f1:1a26> lsusb_dump
> >>
> >> Sure. The dump file is attached.
> >>
> >> Thanks!
> >
> > Has anyone by chance managed to take a look at this lsusb dump?
> >
> > To recap:
> > the HP Slate has two integrated we cams: One forward facing for video
> > calls, and one higher-resolution rear-facing for snapping photos. There
> > appears to be a single controller for both cameras. In linux, lsusb only
> > shows one webcam device. In windows, the device manager also shows only
> > one device for the webcam. However, in windows applications that use the
> > webcam (i.e. HP's webcam application, and in skype) I'm able to select
> > which one to use as an option. In linux, there is only one video
> > device, /dev/video0.
> >
> > There does not appear to be any control available from uvcdynctrl or
> > within vlc to select which physical camera to use. I've tried setting
> > the resolution in vlc when I use the "open capture device" menu item. I
> > know that the forward facing camera is VGA so I tried specifying
> > 640x480, but the result is that it shows the rear-camera stream at a low
> > resolution, rather then showing the forward-camera stream.
> >
> > I'd appreciate any suggestions on how to get the forward-facing camera
> > to work in linux (for skype/google video calls). Also, if it is clear
> > that this facility is not available in UVC and that there is no way this
> > is possilble, that would also be useful information.
> >
> > Thanks again
>
> Hi,
>
> suddenly i do not see any control to switch the sensor. I assume there
> can be two variants how it may work:
> 1. vendor specific extension unit for uvc
> 2. or usb mode switcher
>
> if both sensors have same capabilities, the 1. make sense. If not then
> second. Because this usb dump report settings only for one sensor.
>
> For 1. it will be probably possible to control it with libwebcam. For 2.
> it should be possible to control it with some kind of usb_modeswitch
> (i'm not up to date).
>
> To find what it is actually, there can be fallowing options:
> 1. sniff usb traffic
> 2. see if the windows driver has some advise for us
> 3. unscrew your laptop and find what control use your webcam.
My guess is that the camera uses either an extension unit (XU) control or a
vendor-specific request to select between the two sensors (which is very
unfortunate, given that the UVC specification has explicit support for dual-
sensor cameras, and I would have liked to test that code :-)).
Let's start with the XU control. I've attached a patch for the yavta test
application (http://git.ideasonboard.org/?p=yavta.git;a=summary) to this e-
mail. Could you please apply it, compile the application with
make
run
yavta /dev/video0
and report the results ?
If your kernel headers are not recent enough (which I expect), compilation
will fail. In that case you will need to download a recent kernel source tree,
run
make headers_install
in the kernel tree (this will install the headers in the local directory, it
won't mess up with your system) and then compile yavta with
make KDIR=/path/to/kernel/tree
--
Regards,
Laurent Pinchart
diff --git a/Makefile b/Makefile
index 4a9f055..9987d56 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,8 @@
CROSS_COMPILE ?=
+KDIR ?=
CC := $(CROSS_COMPILE)gcc
-CFLAGS ?= -O2 -W -Wall
+CFLAGS ?= -O2 -W -Wall -I$(KDIR)/usr/include
LDFLAGS ?=
LIBS := -lrt
diff --git a/yavta.c b/yavta.c
index be2f40c..7a3e35f 100644
--- a/yavta.c
+++ b/yavta.c
@@ -32,6 +32,8 @@
#include <sys/select.h>
#include <sys/time.h>
+#include <linux/usb/video.h>
+#include <linux/uvcvideo.h>
#include <linux/videodev2.h>
#ifndef V4L2_BUF_FLAG_ERROR
@@ -233,6 +235,75 @@ static void video_close(struct device *dev)
close(dev->fd);
}
+/* -----------------------------------------------------------------------------
+ * UVC XU controls
+ */
+
+static void query_xu_controls(struct device *dev, unsigned int unit,
+ unsigned int count)
+{
+ struct uvc_xu_control_query query;
+ unsigned int i;
+ uint8_t data[2];
+ uint16_t size;
+ uint8_t info;
+ int ret;
+
+ for (i = 0; i < count; ++i)
+ {
+ memset(&query, 0, sizeof query);
+ query.unit = unit;
+ query.selector = i + 1;
+ query.query = UVC_GET_INFO;
+ query.size = 1;
+ query.data = data;
+
+ ret = ioctl(dev->fd, UVCIOC_CTRL_QUERY, &query);
+ if (ret < 0)
+ {
+ printf("failed to query XU control %u info: %s (%d)\n", i,
+ strerror(errno), errno);
+ continue;
+ }
+
+ info = data[0];
+
+ memset(&query, 0, sizeof query);
+ query.unit = unit;
+ query.selector = i + 1;
+ query.query = UVC_GET_LEN;
+ query.size = 2;
+ query.data = data;
+
+ ret = ioctl(dev->fd, UVCIOC_CTRL_QUERY, &query);
+ if (ret < 0)
+ {
+ printf("failed to query XU control %u size: %s (%d)\n", i,
+ strerror(errno), errno);
+ continue;
+ }
+
+ size = (data[1] << 8) | data[0];
+
+ printf("XU control %u: info ", i);
+ if (info & UVC_CONTROL_CAP_GET)
+ printf("GET ");
+ if (info & UVC_CONTROL_CAP_SET)
+ printf("SET ");
+ if (info & UVC_CONTROL_CAP_DISABLED)
+ printf("DISABLED ");
+ if (info & UVC_CONTROL_CAP_AUTOUPDATE)
+ printf("AUTOUPDATE ");
+ if (info & UVC_CONTROL_CAP_ASYNCHRONOUS)
+ printf("ASYNCHRONOUS ");
+ printf("(0x%02x) %u bytes\n", info, size);
+ }
+}
+
+/* -----------------------------------------------------------------------------
+ * V4L2 controls
+ */
+
static void uvc_get_control(struct device *dev, unsigned int id)
{
struct v4l2_control ctrl;
@@ -1354,6 +1425,8 @@ int main(int argc, char *argv[])
if (ret < 0)
return 1;
+ query_xu_controls(&dev, 2, 8);
+
if (dev.type == (enum v4l2_buf_type)-1)
no_query = 1;
_______________________________________________
Linux-uvc-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/linux-uvc-devel