* [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2
@ 2015-04-24 7:04 Vasily Khoruzhick
2015-04-24 7:04 ` [PATCH v2 2/2] gspca: sn9c2028: Add gain and autogain controls " Vasily Khoruzhick
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Vasily Khoruzhick @ 2015-04-24 7:04 UTC (permalink / raw)
To: Hans de Goede, linux-media, Mauro Carvalho Chehab; +Cc: Vasily Khoruzhick
This cam seems to return different values on long commands, so make status check
in sn9c2028_long_command() more tolerant. Anyway, read value isn't used anywhere
later.
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
---
v2: update commit message to explain change in sn9c2028_long_command()
drivers/media/usb/gspca/sn9c2028.c | 120 ++++++++++++++++++++++++++++++++++++-
1 file changed, 119 insertions(+), 1 deletion(-)
diff --git a/drivers/media/usb/gspca/sn9c2028.c b/drivers/media/usb/gspca/sn9c2028.c
index 39b6b2e..317b02c 100644
--- a/drivers/media/usb/gspca/sn9c2028.c
+++ b/drivers/media/usb/gspca/sn9c2028.c
@@ -2,6 +2,7 @@
* SN9C2028 library
*
* Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
+ * Copyright (C) 2015 Vasily Khoruzhick <anarsoul@gmail.com>
*
* 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
@@ -128,7 +129,7 @@ static int sn9c2028_long_command(struct gspca_dev *gspca_dev, u8 *command)
status = -1;
for (i = 0; i < 256 && status < 2; i++)
status = sn9c2028_read1(gspca_dev);
- if (status != 2) {
+ if (status < 0) {
pr_err("long command status read error %d\n", status);
return (status < 0) ? status : -EIO;
}
@@ -178,6 +179,9 @@ static int sd_config(struct gspca_dev *gspca_dev,
case 0x7005:
PDEBUG(D_PROBE, "Genius Smart 300 camera");
break;
+ case 0x7003:
+ PDEBUG(D_PROBE, "Genius Videocam Live v2");
+ break;
case 0x8000:
PDEBUG(D_PROBE, "DC31VC");
break;
@@ -530,6 +534,116 @@ static int start_genius_cam(struct gspca_dev *gspca_dev)
ARRAY_SIZE(genius_start_commands));
}
+static int start_genius_videocam_live(struct gspca_dev *gspca_dev)
+{
+ int r;
+ struct sd *sd = (struct sd *) gspca_dev;
+ struct init_command genius_vcam_live_start_commands[] = {
+ {{0x0c, 0x01, 0x00, 0x00, 0x00, 0x00}, 0},
+ {{0x16, 0x01, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x10, 0x00, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
+ {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
+
+ {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
+ {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
+ {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
+ {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
+ {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
+ {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
+ {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
+ {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
+ {{0x1c, 0x20, 0x00, 0x2d, 0x00, 0x00}, 4},
+ {{0x13, 0x20, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x21, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x22, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x23, 0x01, 0x01, 0x00, 0x00}, 4},
+ {{0x13, 0x24, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
+ {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
+ {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
+ {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
+ {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
+ {{0x13, 0x2a, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x2b, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
+ {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
+ {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
+ {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
+ {{0x12, 0x34, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x34, 0x01, 0xa1, 0x00, 0x00}, 4},
+ {{0x13, 0x35, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x01, 0x04, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x02, 0x92, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x25, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x26, 0x02, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x27, 0x88, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x30, 0x38, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x31, 0x2a, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x32, 0x2a, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x33, 0x2a, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x34, 0x02, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x5b, 0x0a, 0x00, 0x00, 0x00}, 4},
+ {{0x13, 0x25, 0x01, 0x28, 0x00, 0x00}, 4},
+ {{0x13, 0x26, 0x01, 0x1e, 0x00, 0x00}, 4},
+ {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
+ {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
+ {{0x13, 0x29, 0x01, 0x62, 0x00, 0x00}, 4},
+ {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
+ {{0x13, 0x2d, 0x01, 0x03, 0x00, 0x00}, 4},
+ {{0x13, 0x2e, 0x01, 0x0f, 0x00, 0x00}, 4},
+ {{0x13, 0x2f, 0x01, 0x0c, 0x00, 0x00}, 4},
+ {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x21, 0x2a, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x23, 0x28, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x11, 0x04, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x13, 0x03, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x15, 0xe0, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x16, 0x02, 0x00, 0x00, 0x00}, 4},
+ {{0x11, 0x17, 0x80, 0x00, 0x00, 0x00}, 4},
+ {{0x1c, 0x20, 0x00, 0x2a, 0x00, 0x00}, 1},
+ {{0x20, 0x34, 0xa1, 0x00, 0x00, 0x00}, 0},
+ /* Camera should start to capture now. */
+ {{0x12, 0x27, 0x01, 0x00, 0x00, 0x00}, 0},
+ {{0x1b, 0x32, 0x26, 0x00, 0x00, 0x00}, 0},
+ {{0x1d, 0x25, 0x10, 0x20, 0xab, 0x00}, 0},
+ };
+
+ r = run_start_commands(gspca_dev, genius_vcam_live_start_commands,
+ ARRAY_SIZE(genius_vcam_live_start_commands));
+ if (r < 0)
+ return r;
+
+ return r;
+}
+
static int start_vivitar_cam(struct gspca_dev *gspca_dev)
{
struct init_command vivitar_start_commands[] = {
@@ -623,6 +737,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
case 0x7005:
err_code = start_genius_cam(gspca_dev);
break;
+ case 0x7003:
+ err_code = start_genius_videocam_live(gspca_dev);
+ break;
case 0x8001:
err_code = start_spy_cam(gspca_dev);
break;
@@ -701,6 +818,7 @@ static const struct sd_desc sd_desc = {
/* -- module initialisation -- */
static const struct usb_device_id device_table[] = {
{USB_DEVICE(0x0458, 0x7005)}, /* Genius Smart 300, version 2 */
+ {USB_DEVICE(0x0458, 0x7003)}, /* Genius Videocam Live v2 */
/* The Genius Smart is untested. I can't find an owner ! */
/* {USB_DEVICE(0x0c45, 0x8000)}, DC31VC, Don't know this camera */
{USB_DEVICE(0x0c45, 0x8001)}, /* Wild Planet digital spy cam */
--
2.3.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/2] gspca: sn9c2028: Add gain and autogain controls Genius Videocam Live v2
2015-04-24 7:04 [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2 Vasily Khoruzhick
@ 2015-04-24 7:04 ` Vasily Khoruzhick
2015-05-15 15:55 ` [PATCH v2 1/2] gspca: sn9c2028: Add support for " Vasily Khoruzhick
2015-05-20 12:12 ` Mauro Carvalho Chehab
2 siblings, 0 replies; 8+ messages in thread
From: Vasily Khoruzhick @ 2015-04-24 7:04 UTC (permalink / raw)
To: Hans de Goede, linux-media, Mauro Carvalho Chehab; +Cc: Vasily Khoruzhick
Autogain algorithm is very simple, if average luminance is low - increase gain,
if it's high - decrease gain. Gain granularity is low enough for this algo to
stabilize quickly.
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
---
v2: According to Hans, header lenght is 12 bytes, so drop 2 redundant bytes
drivers/media/usb/gspca/sn9c2028.c | 122 +++++++++++++++++++++++++++++++++++++
drivers/media/usb/gspca/sn9c2028.h | 18 +++++-
2 files changed, 137 insertions(+), 3 deletions(-)
diff --git a/drivers/media/usb/gspca/sn9c2028.c b/drivers/media/usb/gspca/sn9c2028.c
index 317b02c..107200e 100644
--- a/drivers/media/usb/gspca/sn9c2028.c
+++ b/drivers/media/usb/gspca/sn9c2028.c
@@ -34,6 +34,16 @@ struct sd {
struct gspca_dev gspca_dev; /* !! must be the first item */
u8 sof_read;
u16 model;
+
+#define MIN_AVG_LUM 8500
+#define MAX_AVG_LUM 10000
+ int avg_lum;
+ u8 avg_lum_l;
+
+ struct { /* autogain and gain control cluster */
+ struct v4l2_ctrl *autogain;
+ struct v4l2_ctrl *gain;
+ };
};
struct init_command {
@@ -252,6 +262,78 @@ static int run_start_commands(struct gspca_dev *gspca_dev,
return 0;
}
+static void set_gain(struct gspca_dev *gspca_dev, s32 g)
+{
+ struct sd *sd = (struct sd *) gspca_dev;
+
+ struct init_command genius_vcam_live_gain_cmds[] = {
+ {{0x1d, 0x25, 0x10 /* This byte is gain */,
+ 0x20, 0xab, 0x00}, 0},
+ };
+ if (!gspca_dev->streaming)
+ return;
+
+ switch (sd->model) {
+ case 0x7003:
+ genius_vcam_live_gain_cmds[0].instruction[2] = g;
+ run_start_commands(gspca_dev, genius_vcam_live_gain_cmds,
+ ARRAY_SIZE(genius_vcam_live_gain_cmds));
+ break;
+ default:
+ break;
+ }
+}
+
+static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+ struct gspca_dev *gspca_dev =
+ container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
+ struct sd *sd = (struct sd *)gspca_dev;
+
+ gspca_dev->usb_err = 0;
+
+ if (!gspca_dev->streaming)
+ return 0;
+
+ switch (ctrl->id) {
+ /* standalone gain control */
+ case V4L2_CID_GAIN:
+ set_gain(gspca_dev, ctrl->val);
+ break;
+ /* autogain */
+ case V4L2_CID_AUTOGAIN:
+ set_gain(gspca_dev, sd->gain->val);
+ break;
+ }
+ return gspca_dev->usb_err;
+}
+
+static const struct v4l2_ctrl_ops sd_ctrl_ops = {
+ .s_ctrl = sd_s_ctrl,
+};
+
+
+static int sd_init_controls(struct gspca_dev *gspca_dev)
+{
+ struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
+ struct sd *sd = (struct sd *)gspca_dev;
+
+ gspca_dev->vdev.ctrl_handler = hdl;
+ v4l2_ctrl_handler_init(hdl, 2);
+
+ switch (sd->model) {
+ case 0x7003:
+ sd->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
+ V4L2_CID_GAIN, 0, 20, 1, 0);
+ sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
+ V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
static int start_spy_cam(struct gspca_dev *gspca_dev)
{
struct init_command spy_start_commands[] = {
@@ -641,6 +723,9 @@ static int start_genius_videocam_live(struct gspca_dev *gspca_dev)
if (r < 0)
return r;
+ if (sd->gain)
+ set_gain(gspca_dev, v4l2_ctrl_g_ctrl(sd->gain));
+
return r;
}
@@ -757,6 +842,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
return -ENXIO;
}
+ sd->avg_lum = -1;
+
return err_code;
}
@@ -776,6 +863,39 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
PERR("Camera Stop command failed");
}
+static void do_autogain(struct gspca_dev *gspca_dev, int avg_lum)
+{
+ struct sd *sd = (struct sd *) gspca_dev;
+ s32 cur_gain = v4l2_ctrl_g_ctrl(sd->gain);
+
+ if (avg_lum == -1)
+ return;
+
+ if (avg_lum < MIN_AVG_LUM) {
+ if (cur_gain == sd->gain->maximum)
+ return;
+ cur_gain++;
+ v4l2_ctrl_s_ctrl(sd->gain, cur_gain);
+ }
+ if (avg_lum > MAX_AVG_LUM) {
+ if (cur_gain == sd->gain->minimum)
+ return;
+ cur_gain--;
+ v4l2_ctrl_s_ctrl(sd->gain, cur_gain);
+ }
+
+}
+
+static void sd_dqcallback(struct gspca_dev *gspca_dev)
+{
+ struct sd *sd = (struct sd *) gspca_dev;
+
+ if (sd->autogain == NULL || !v4l2_ctrl_g_ctrl(sd->autogain))
+ return;
+
+ do_autogain(gspca_dev, sd->avg_lum);
+}
+
/* Include sn9c2028 sof detection functions */
#include "sn9c2028.h"
@@ -810,8 +930,10 @@ static const struct sd_desc sd_desc = {
.name = MODULE_NAME,
.config = sd_config,
.init = sd_init,
+ .init_controls = sd_init_controls,
.start = sd_start,
.stopN = sd_stopN,
+ .dq_callback = sd_dqcallback,
.pkt_scan = sd_pkt_scan,
};
diff --git a/drivers/media/usb/gspca/sn9c2028.h b/drivers/media/usb/gspca/sn9c2028.h
index 8fd1d3e..f85bc10 100644
--- a/drivers/media/usb/gspca/sn9c2028.h
+++ b/drivers/media/usb/gspca/sn9c2028.h
@@ -21,8 +21,15 @@
*
*/
-static const unsigned char sn9c2028_sof_marker[5] =
- { 0xff, 0xff, 0x00, 0xc4, 0xc4 };
+static const unsigned char sn9c2028_sof_marker[] = {
+ 0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96,
+ 0x00,
+ 0x00, /* seq */
+ 0x00,
+ 0x00,
+ 0x00, /* avg luminance lower 8 bit */
+ 0x00, /* avg luminance higher 8 bit */
+};
static unsigned char *sn9c2028_find_sof(struct gspca_dev *gspca_dev,
unsigned char *m, int len)
@@ -32,8 +39,13 @@ static unsigned char *sn9c2028_find_sof(struct gspca_dev *gspca_dev,
/* Search for the SOF marker (fixed part) in the header */
for (i = 0; i < len; i++) {
- if (m[i] == sn9c2028_sof_marker[sd->sof_read]) {
+ if ((m[i] == sn9c2028_sof_marker[sd->sof_read]) ||
+ (sd->sof_read > 5)) {
sd->sof_read++;
+ if (sd->sof_read == 11)
+ sd->avg_lum_l = m[i];
+ if (sd->sof_read == 12)
+ sd->avg_lum = (m[i] << 8) + sd->avg_lum_l;
if (sd->sof_read == sizeof(sn9c2028_sof_marker)) {
PDEBUG(D_FRAM,
"SOF found, bytes to analyze: %u."
--
2.3.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2
2015-04-24 7:04 [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2 Vasily Khoruzhick
2015-04-24 7:04 ` [PATCH v2 2/2] gspca: sn9c2028: Add gain and autogain controls " Vasily Khoruzhick
@ 2015-05-15 15:55 ` Vasily Khoruzhick
2015-05-15 17:51 ` Hans de Goede
2015-05-20 12:12 ` Mauro Carvalho Chehab
2 siblings, 1 reply; 8+ messages in thread
From: Vasily Khoruzhick @ 2015-05-15 15:55 UTC (permalink / raw)
To: Hans de Goede, Linux Media Mailing List, Mauro Carvalho Chehab
Cc: Vasily Khoruzhick
Ping?
On Fri, Apr 24, 2015 at 10:04 AM, Vasily Khoruzhick <anarsoul@gmail.com> wrote:
> This cam seems to return different values on long commands, so make status check
> in sn9c2028_long_command() more tolerant. Anyway, read value isn't used anywhere
> later.
>
> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
> ---
> v2: update commit message to explain change in sn9c2028_long_command()
>
> drivers/media/usb/gspca/sn9c2028.c | 120 ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 119 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/usb/gspca/sn9c2028.c b/drivers/media/usb/gspca/sn9c2028.c
> index 39b6b2e..317b02c 100644
> --- a/drivers/media/usb/gspca/sn9c2028.c
> +++ b/drivers/media/usb/gspca/sn9c2028.c
> @@ -2,6 +2,7 @@
> * SN9C2028 library
> *
> * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
> + * Copyright (C) 2015 Vasily Khoruzhick <anarsoul@gmail.com>
> *
> * 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
> @@ -128,7 +129,7 @@ static int sn9c2028_long_command(struct gspca_dev *gspca_dev, u8 *command)
> status = -1;
> for (i = 0; i < 256 && status < 2; i++)
> status = sn9c2028_read1(gspca_dev);
> - if (status != 2) {
> + if (status < 0) {
> pr_err("long command status read error %d\n", status);
> return (status < 0) ? status : -EIO;
> }
> @@ -178,6 +179,9 @@ static int sd_config(struct gspca_dev *gspca_dev,
> case 0x7005:
> PDEBUG(D_PROBE, "Genius Smart 300 camera");
> break;
> + case 0x7003:
> + PDEBUG(D_PROBE, "Genius Videocam Live v2");
> + break;
> case 0x8000:
> PDEBUG(D_PROBE, "DC31VC");
> break;
> @@ -530,6 +534,116 @@ static int start_genius_cam(struct gspca_dev *gspca_dev)
> ARRAY_SIZE(genius_start_commands));
> }
>
> +static int start_genius_videocam_live(struct gspca_dev *gspca_dev)
> +{
> + int r;
> + struct sd *sd = (struct sd *) gspca_dev;
> + struct init_command genius_vcam_live_start_commands[] = {
> + {{0x0c, 0x01, 0x00, 0x00, 0x00, 0x00}, 0},
> + {{0x16, 0x01, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x10, 0x00, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
> + {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
> +
> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
> + {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
> + {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
> + {{0x1c, 0x20, 0x00, 0x2d, 0x00, 0x00}, 4},
> + {{0x13, 0x20, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x21, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x22, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x23, 0x01, 0x01, 0x00, 0x00}, 4},
> + {{0x13, 0x24, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
> + {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
> + {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
> + {{0x13, 0x2a, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x2b, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
> + {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
> + {{0x12, 0x34, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x34, 0x01, 0xa1, 0x00, 0x00}, 4},
> + {{0x13, 0x35, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x01, 0x04, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x02, 0x92, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x25, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x26, 0x02, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x27, 0x88, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x30, 0x38, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x31, 0x2a, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x32, 0x2a, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x33, 0x2a, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x34, 0x02, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x5b, 0x0a, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x25, 0x01, 0x28, 0x00, 0x00}, 4},
> + {{0x13, 0x26, 0x01, 0x1e, 0x00, 0x00}, 4},
> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
> + {{0x13, 0x29, 0x01, 0x62, 0x00, 0x00}, 4},
> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2d, 0x01, 0x03, 0x00, 0x00}, 4},
> + {{0x13, 0x2e, 0x01, 0x0f, 0x00, 0x00}, 4},
> + {{0x13, 0x2f, 0x01, 0x0c, 0x00, 0x00}, 4},
> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x21, 0x2a, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x23, 0x28, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x11, 0x04, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x13, 0x03, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x15, 0xe0, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x16, 0x02, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x17, 0x80, 0x00, 0x00, 0x00}, 4},
> + {{0x1c, 0x20, 0x00, 0x2a, 0x00, 0x00}, 1},
> + {{0x20, 0x34, 0xa1, 0x00, 0x00, 0x00}, 0},
> + /* Camera should start to capture now. */
> + {{0x12, 0x27, 0x01, 0x00, 0x00, 0x00}, 0},
> + {{0x1b, 0x32, 0x26, 0x00, 0x00, 0x00}, 0},
> + {{0x1d, 0x25, 0x10, 0x20, 0xab, 0x00}, 0},
> + };
> +
> + r = run_start_commands(gspca_dev, genius_vcam_live_start_commands,
> + ARRAY_SIZE(genius_vcam_live_start_commands));
> + if (r < 0)
> + return r;
> +
> + return r;
> +}
> +
> static int start_vivitar_cam(struct gspca_dev *gspca_dev)
> {
> struct init_command vivitar_start_commands[] = {
> @@ -623,6 +737,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
> case 0x7005:
> err_code = start_genius_cam(gspca_dev);
> break;
> + case 0x7003:
> + err_code = start_genius_videocam_live(gspca_dev);
> + break;
> case 0x8001:
> err_code = start_spy_cam(gspca_dev);
> break;
> @@ -701,6 +818,7 @@ static const struct sd_desc sd_desc = {
> /* -- module initialisation -- */
> static const struct usb_device_id device_table[] = {
> {USB_DEVICE(0x0458, 0x7005)}, /* Genius Smart 300, version 2 */
> + {USB_DEVICE(0x0458, 0x7003)}, /* Genius Videocam Live v2 */
> /* The Genius Smart is untested. I can't find an owner ! */
> /* {USB_DEVICE(0x0c45, 0x8000)}, DC31VC, Don't know this camera */
> {USB_DEVICE(0x0c45, 0x8001)}, /* Wild Planet digital spy cam */
> --
> 2.3.5
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2
2015-05-15 15:55 ` [PATCH v2 1/2] gspca: sn9c2028: Add support for " Vasily Khoruzhick
@ 2015-05-15 17:51 ` Hans de Goede
2015-05-15 18:26 ` Vasily Khoruzhick
0 siblings, 1 reply; 8+ messages in thread
From: Hans de Goede @ 2015-05-15 17:51 UTC (permalink / raw)
To: Vasily Khoruzhick, Linux Media Mailing List, Mauro Carvalho Chehab
Hi Vasily
On 15-05-15 17:55, Vasily Khoruzhick wrote:
> Ping?
Sorry for being a bit slow on this one, v2 looks good. I'll queue it up for
merging into 4.2 as soon as I find some time to work on this,
Regards,
Hans
>
> On Fri, Apr 24, 2015 at 10:04 AM, Vasily Khoruzhick <anarsoul@gmail.com> wrote:
>> This cam seems to return different values on long commands, so make status check
>> in sn9c2028_long_command() more tolerant. Anyway, read value isn't used anywhere
>> later.
>>
>> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
>> ---
>> v2: update commit message to explain change in sn9c2028_long_command()
>>
>> drivers/media/usb/gspca/sn9c2028.c | 120 ++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 119 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/media/usb/gspca/sn9c2028.c b/drivers/media/usb/gspca/sn9c2028.c
>> index 39b6b2e..317b02c 100644
>> --- a/drivers/media/usb/gspca/sn9c2028.c
>> +++ b/drivers/media/usb/gspca/sn9c2028.c
>> @@ -2,6 +2,7 @@
>> * SN9C2028 library
>> *
>> * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
>> + * Copyright (C) 2015 Vasily Khoruzhick <anarsoul@gmail.com>
>> *
>> * 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
>> @@ -128,7 +129,7 @@ static int sn9c2028_long_command(struct gspca_dev *gspca_dev, u8 *command)
>> status = -1;
>> for (i = 0; i < 256 && status < 2; i++)
>> status = sn9c2028_read1(gspca_dev);
>> - if (status != 2) {
>> + if (status < 0) {
>> pr_err("long command status read error %d\n", status);
>> return (status < 0) ? status : -EIO;
>> }
>> @@ -178,6 +179,9 @@ static int sd_config(struct gspca_dev *gspca_dev,
>> case 0x7005:
>> PDEBUG(D_PROBE, "Genius Smart 300 camera");
>> break;
>> + case 0x7003:
>> + PDEBUG(D_PROBE, "Genius Videocam Live v2");
>> + break;
>> case 0x8000:
>> PDEBUG(D_PROBE, "DC31VC");
>> break;
>> @@ -530,6 +534,116 @@ static int start_genius_cam(struct gspca_dev *gspca_dev)
>> ARRAY_SIZE(genius_start_commands));
>> }
>>
>> +static int start_genius_videocam_live(struct gspca_dev *gspca_dev)
>> +{
>> + int r;
>> + struct sd *sd = (struct sd *) gspca_dev;
>> + struct init_command genius_vcam_live_start_commands[] = {
>> + {{0x0c, 0x01, 0x00, 0x00, 0x00, 0x00}, 0},
>> + {{0x16, 0x01, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x10, 0x00, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
>> + {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
>> +
>> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
>> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
>> + {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
>> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
>> + {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
>> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
>> + {{0x1c, 0x20, 0x00, 0x2d, 0x00, 0x00}, 4},
>> + {{0x13, 0x20, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x21, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x22, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x23, 0x01, 0x01, 0x00, 0x00}, 4},
>> + {{0x13, 0x24, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
>> + {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
>> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
>> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
>> + {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
>> + {{0x13, 0x2a, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x2b, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
>> + {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
>> + {{0x12, 0x34, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x34, 0x01, 0xa1, 0x00, 0x00}, 4},
>> + {{0x13, 0x35, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x01, 0x04, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x02, 0x92, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x25, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x26, 0x02, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x27, 0x88, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x30, 0x38, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x31, 0x2a, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x32, 0x2a, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x33, 0x2a, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x34, 0x02, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x5b, 0x0a, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x25, 0x01, 0x28, 0x00, 0x00}, 4},
>> + {{0x13, 0x26, 0x01, 0x1e, 0x00, 0x00}, 4},
>> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
>> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
>> + {{0x13, 0x29, 0x01, 0x62, 0x00, 0x00}, 4},
>> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2d, 0x01, 0x03, 0x00, 0x00}, 4},
>> + {{0x13, 0x2e, 0x01, 0x0f, 0x00, 0x00}, 4},
>> + {{0x13, 0x2f, 0x01, 0x0c, 0x00, 0x00}, 4},
>> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x21, 0x2a, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x23, 0x28, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x11, 0x04, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x13, 0x03, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x15, 0xe0, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x16, 0x02, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x17, 0x80, 0x00, 0x00, 0x00}, 4},
>> + {{0x1c, 0x20, 0x00, 0x2a, 0x00, 0x00}, 1},
>> + {{0x20, 0x34, 0xa1, 0x00, 0x00, 0x00}, 0},
>> + /* Camera should start to capture now. */
>> + {{0x12, 0x27, 0x01, 0x00, 0x00, 0x00}, 0},
>> + {{0x1b, 0x32, 0x26, 0x00, 0x00, 0x00}, 0},
>> + {{0x1d, 0x25, 0x10, 0x20, 0xab, 0x00}, 0},
>> + };
>> +
>> + r = run_start_commands(gspca_dev, genius_vcam_live_start_commands,
>> + ARRAY_SIZE(genius_vcam_live_start_commands));
>> + if (r < 0)
>> + return r;
>> +
>> + return r;
>> +}
>> +
>> static int start_vivitar_cam(struct gspca_dev *gspca_dev)
>> {
>> struct init_command vivitar_start_commands[] = {
>> @@ -623,6 +737,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
>> case 0x7005:
>> err_code = start_genius_cam(gspca_dev);
>> break;
>> + case 0x7003:
>> + err_code = start_genius_videocam_live(gspca_dev);
>> + break;
>> case 0x8001:
>> err_code = start_spy_cam(gspca_dev);
>> break;
>> @@ -701,6 +818,7 @@ static const struct sd_desc sd_desc = {
>> /* -- module initialisation -- */
>> static const struct usb_device_id device_table[] = {
>> {USB_DEVICE(0x0458, 0x7005)}, /* Genius Smart 300, version 2 */
>> + {USB_DEVICE(0x0458, 0x7003)}, /* Genius Videocam Live v2 */
>> /* The Genius Smart is untested. I can't find an owner ! */
>> /* {USB_DEVICE(0x0c45, 0x8000)}, DC31VC, Don't know this camera */
>> {USB_DEVICE(0x0c45, 0x8001)}, /* Wild Planet digital spy cam */
>> --
>> 2.3.5
>>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2
2015-05-15 17:51 ` Hans de Goede
@ 2015-05-15 18:26 ` Vasily Khoruzhick
0 siblings, 0 replies; 8+ messages in thread
From: Vasily Khoruzhick @ 2015-05-15 18:26 UTC (permalink / raw)
To: Hans de Goede; +Cc: Linux Media Mailing List, Mauro Carvalho Chehab
Hi Hans,
On Fri, May 15, 2015 at 8:51 PM, Hans de Goede <hdegoede@redhat.com> wrote:
> Sorry for being a bit slow on this one, v2 looks good. I'll queue it up for
> merging into 4.2 as soon as I find some time to work on this,
Thanks!
Regards,
Vasily
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2
2015-04-24 7:04 [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2 Vasily Khoruzhick
2015-04-24 7:04 ` [PATCH v2 2/2] gspca: sn9c2028: Add gain and autogain controls " Vasily Khoruzhick
2015-05-15 15:55 ` [PATCH v2 1/2] gspca: sn9c2028: Add support for " Vasily Khoruzhick
@ 2015-05-20 12:12 ` Mauro Carvalho Chehab
2015-05-20 17:48 ` Hans de Goede
2015-05-20 18:48 ` Vasily Khoruzhick
2 siblings, 2 replies; 8+ messages in thread
From: Mauro Carvalho Chehab @ 2015-05-20 12:12 UTC (permalink / raw)
To: Vasily Khoruzhick, Hans de Goede; +Cc: linux-media
Em Fri, 24 Apr 2015 10:04:03 +0300
Vasily Khoruzhick <anarsoul@gmail.com> escreveu:
> This cam seems to return different values on long commands, so make status check
> in sn9c2028_long_command() more tolerant. Anyway, read value isn't used anywhere
> later.
>
> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Hans,
You forgot to add your SOB on those two patches on your pull request.
> ---
> v2: update commit message to explain change in sn9c2028_long_command()
>
> drivers/media/usb/gspca/sn9c2028.c | 120 ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 119 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/usb/gspca/sn9c2028.c b/drivers/media/usb/gspca/sn9c2028.c
> index 39b6b2e..317b02c 100644
> --- a/drivers/media/usb/gspca/sn9c2028.c
> +++ b/drivers/media/usb/gspca/sn9c2028.c
> @@ -2,6 +2,7 @@
> * SN9C2028 library
> *
> * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
> + * Copyright (C) 2015 Vasily Khoruzhick <anarsoul@gmail.com>
Hmm... adding a new copyright driver-wide only justifies if you changed 30%
or more of the code. The copyright of your changes will be preserved at
the git history.
> *
> * 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
> @@ -128,7 +129,7 @@ static int sn9c2028_long_command(struct gspca_dev *gspca_dev, u8 *command)
> status = -1;
> for (i = 0; i < 256 && status < 2; i++)
> status = sn9c2028_read1(gspca_dev);
> - if (status != 2) {
> + if (status < 0) {
> pr_err("long command status read error %d\n", status);
> return (status < 0) ? status : -EIO;
> }
> @@ -178,6 +179,9 @@ static int sd_config(struct gspca_dev *gspca_dev,
> case 0x7005:
> PDEBUG(D_PROBE, "Genius Smart 300 camera");
> break;
> + case 0x7003:
> + PDEBUG(D_PROBE, "Genius Videocam Live v2");
> + break;
> case 0x8000:
> PDEBUG(D_PROBE, "DC31VC");
> break;
> @@ -530,6 +534,116 @@ static int start_genius_cam(struct gspca_dev *gspca_dev)
> ARRAY_SIZE(genius_start_commands));
> }
>
> +static int start_genius_videocam_live(struct gspca_dev *gspca_dev)
> +{
> + int r;
> + struct sd *sd = (struct sd *) gspca_dev;
> + struct init_command genius_vcam_live_start_commands[] = {
> + {{0x0c, 0x01, 0x00, 0x00, 0x00, 0x00}, 0},
> + {{0x16, 0x01, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x10, 0x00, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
> + {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
> +
> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
> + {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
> + {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
> + {{0x1c, 0x20, 0x00, 0x2d, 0x00, 0x00}, 4},
> + {{0x13, 0x20, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x21, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x22, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x23, 0x01, 0x01, 0x00, 0x00}, 4},
> + {{0x13, 0x24, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
> + {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
> + {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
> + {{0x13, 0x2a, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x2b, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
> + {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
> + {{0x12, 0x34, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x34, 0x01, 0xa1, 0x00, 0x00}, 4},
> + {{0x13, 0x35, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x01, 0x04, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x02, 0x92, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x25, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x26, 0x02, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x27, 0x88, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x30, 0x38, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x31, 0x2a, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x32, 0x2a, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x33, 0x2a, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x34, 0x02, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x5b, 0x0a, 0x00, 0x00, 0x00}, 4},
> + {{0x13, 0x25, 0x01, 0x28, 0x00, 0x00}, 4},
> + {{0x13, 0x26, 0x01, 0x1e, 0x00, 0x00}, 4},
> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
> + {{0x13, 0x29, 0x01, 0x62, 0x00, 0x00}, 4},
> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
> + {{0x13, 0x2d, 0x01, 0x03, 0x00, 0x00}, 4},
> + {{0x13, 0x2e, 0x01, 0x0f, 0x00, 0x00}, 4},
> + {{0x13, 0x2f, 0x01, 0x0c, 0x00, 0x00}, 4},
> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x21, 0x2a, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x23, 0x28, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x11, 0x04, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x13, 0x03, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x15, 0xe0, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x16, 0x02, 0x00, 0x00, 0x00}, 4},
> + {{0x11, 0x17, 0x80, 0x00, 0x00, 0x00}, 4},
> + {{0x1c, 0x20, 0x00, 0x2a, 0x00, 0x00}, 1},
> + {{0x20, 0x34, 0xa1, 0x00, 0x00, 0x00}, 0},
> + /* Camera should start to capture now. */
> + {{0x12, 0x27, 0x01, 0x00, 0x00, 0x00}, 0},
> + {{0x1b, 0x32, 0x26, 0x00, 0x00, 0x00}, 0},
> + {{0x1d, 0x25, 0x10, 0x20, 0xab, 0x00}, 0},
> + };
> +
> + r = run_start_commands(gspca_dev, genius_vcam_live_start_commands,
> + ARRAY_SIZE(genius_vcam_live_start_commands));
> + if (r < 0)
> + return r;
> +
> + return r;
> +}
> +
> static int start_vivitar_cam(struct gspca_dev *gspca_dev)
> {
> struct init_command vivitar_start_commands[] = {
> @@ -623,6 +737,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
> case 0x7005:
> err_code = start_genius_cam(gspca_dev);
> break;
> + case 0x7003:
> + err_code = start_genius_videocam_live(gspca_dev);
> + break;
> case 0x8001:
> err_code = start_spy_cam(gspca_dev);
> break;
> @@ -701,6 +818,7 @@ static const struct sd_desc sd_desc = {
> /* -- module initialisation -- */
> static const struct usb_device_id device_table[] = {
> {USB_DEVICE(0x0458, 0x7005)}, /* Genius Smart 300, version 2 */
> + {USB_DEVICE(0x0458, 0x7003)}, /* Genius Videocam Live v2 */
> /* The Genius Smart is untested. I can't find an owner ! */
> /* {USB_DEVICE(0x0c45, 0x8000)}, DC31VC, Don't know this camera */
> {USB_DEVICE(0x0c45, 0x8001)}, /* Wild Planet digital spy cam */
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2
2015-05-20 12:12 ` Mauro Carvalho Chehab
@ 2015-05-20 17:48 ` Hans de Goede
2015-05-20 18:48 ` Vasily Khoruzhick
1 sibling, 0 replies; 8+ messages in thread
From: Hans de Goede @ 2015-05-20 17:48 UTC (permalink / raw)
To: Mauro Carvalho Chehab, Vasily Khoruzhick; +Cc: linux-media
Hi,
On 20-05-15 14:12, Mauro Carvalho Chehab wrote:
> Em Fri, 24 Apr 2015 10:04:03 +0300
> Vasily Khoruzhick <anarsoul@gmail.com> escreveu:
>
>> This cam seems to return different values on long commands, so make status check
>> in sn9c2028_long_command() more tolerant. Anyway, read value isn't used anywhere
>> later.
>>
>> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
>
> Hans,
>
> You forgot to add your SOB on those two patches on your pull request.
Weird I always use git am -s, ah well. I'll send a new pull-req fixing this.
Regards,
Hans
>
>> ---
>> v2: update commit message to explain change in sn9c2028_long_command()
>>
>> drivers/media/usb/gspca/sn9c2028.c | 120 ++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 119 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/media/usb/gspca/sn9c2028.c b/drivers/media/usb/gspca/sn9c2028.c
>> index 39b6b2e..317b02c 100644
>> --- a/drivers/media/usb/gspca/sn9c2028.c
>> +++ b/drivers/media/usb/gspca/sn9c2028.c
>> @@ -2,6 +2,7 @@
>> * SN9C2028 library
>> *
>> * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
>> + * Copyright (C) 2015 Vasily Khoruzhick <anarsoul@gmail.com>
>
> Hmm... adding a new copyright driver-wide only justifies if you changed 30%
> or more of the code. The copyright of your changes will be preserved at
> the git history.
>
>> *
>> * 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
>> @@ -128,7 +129,7 @@ static int sn9c2028_long_command(struct gspca_dev *gspca_dev, u8 *command)
>> status = -1;
>> for (i = 0; i < 256 && status < 2; i++)
>> status = sn9c2028_read1(gspca_dev);
>> - if (status != 2) {
>> + if (status < 0) {
>> pr_err("long command status read error %d\n", status);
>> return (status < 0) ? status : -EIO;
>> }
>> @@ -178,6 +179,9 @@ static int sd_config(struct gspca_dev *gspca_dev,
>> case 0x7005:
>> PDEBUG(D_PROBE, "Genius Smart 300 camera");
>> break;
>> + case 0x7003:
>> + PDEBUG(D_PROBE, "Genius Videocam Live v2");
>> + break;
>> case 0x8000:
>> PDEBUG(D_PROBE, "DC31VC");
>> break;
>> @@ -530,6 +534,116 @@ static int start_genius_cam(struct gspca_dev *gspca_dev)
>> ARRAY_SIZE(genius_start_commands));
>> }
>>
>> +static int start_genius_videocam_live(struct gspca_dev *gspca_dev)
>> +{
>> + int r;
>> + struct sd *sd = (struct sd *) gspca_dev;
>> + struct init_command genius_vcam_live_start_commands[] = {
>> + {{0x0c, 0x01, 0x00, 0x00, 0x00, 0x00}, 0},
>> + {{0x16, 0x01, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x10, 0x00, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
>> + {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
>> +
>> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
>> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
>> + {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
>> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
>> + {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
>> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
>> + {{0x1c, 0x20, 0x00, 0x2d, 0x00, 0x00}, 4},
>> + {{0x13, 0x20, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x21, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x22, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x23, 0x01, 0x01, 0x00, 0x00}, 4},
>> + {{0x13, 0x24, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x25, 0x01, 0x16, 0x00, 0x00}, 4},
>> + {{0x13, 0x26, 0x01, 0x12, 0x00, 0x00}, 4},
>> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
>> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
>> + {{0x13, 0x29, 0x01, 0x22, 0x00, 0x00}, 4},
>> + {{0x13, 0x2a, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x2b, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2d, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2e, 0x01, 0x09, 0x00, 0x00}, 4},
>> + {{0x13, 0x2f, 0x01, 0x07, 0x00, 0x00}, 4},
>> + {{0x12, 0x34, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x34, 0x01, 0xa1, 0x00, 0x00}, 4},
>> + {{0x13, 0x35, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x01, 0x04, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x02, 0x92, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x11, 0x64, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x13, 0x91, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x15, 0x20, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x16, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x17, 0x60, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x21, 0x2d, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x23, 0x03, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x25, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x26, 0x02, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x27, 0x88, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x30, 0x38, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x31, 0x2a, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x32, 0x2a, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x33, 0x2a, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x34, 0x02, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x5b, 0x0a, 0x00, 0x00, 0x00}, 4},
>> + {{0x13, 0x25, 0x01, 0x28, 0x00, 0x00}, 4},
>> + {{0x13, 0x26, 0x01, 0x1e, 0x00, 0x00}, 4},
>> + {{0x13, 0x28, 0x01, 0x0e, 0x00, 0x00}, 4},
>> + {{0x13, 0x27, 0x01, 0x20, 0x00, 0x00}, 4},
>> + {{0x13, 0x29, 0x01, 0x62, 0x00, 0x00}, 4},
>> + {{0x13, 0x2c, 0x01, 0x02, 0x00, 0x00}, 4},
>> + {{0x13, 0x2d, 0x01, 0x03, 0x00, 0x00}, 4},
>> + {{0x13, 0x2e, 0x01, 0x0f, 0x00, 0x00}, 4},
>> + {{0x13, 0x2f, 0x01, 0x0c, 0x00, 0x00}, 4},
>> + {{0x11, 0x20, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x21, 0x2a, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x22, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x23, 0x28, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x10, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x11, 0x04, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x12, 0x00, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x13, 0x03, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x14, 0x01, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x15, 0xe0, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x16, 0x02, 0x00, 0x00, 0x00}, 4},
>> + {{0x11, 0x17, 0x80, 0x00, 0x00, 0x00}, 4},
>> + {{0x1c, 0x20, 0x00, 0x2a, 0x00, 0x00}, 1},
>> + {{0x20, 0x34, 0xa1, 0x00, 0x00, 0x00}, 0},
>> + /* Camera should start to capture now. */
>> + {{0x12, 0x27, 0x01, 0x00, 0x00, 0x00}, 0},
>> + {{0x1b, 0x32, 0x26, 0x00, 0x00, 0x00}, 0},
>> + {{0x1d, 0x25, 0x10, 0x20, 0xab, 0x00}, 0},
>> + };
>> +
>> + r = run_start_commands(gspca_dev, genius_vcam_live_start_commands,
>> + ARRAY_SIZE(genius_vcam_live_start_commands));
>> + if (r < 0)
>> + return r;
>> +
>> + return r;
>> +}
>> +
>> static int start_vivitar_cam(struct gspca_dev *gspca_dev)
>> {
>> struct init_command vivitar_start_commands[] = {
>> @@ -623,6 +737,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
>> case 0x7005:
>> err_code = start_genius_cam(gspca_dev);
>> break;
>> + case 0x7003:
>> + err_code = start_genius_videocam_live(gspca_dev);
>> + break;
>> case 0x8001:
>> err_code = start_spy_cam(gspca_dev);
>> break;
>> @@ -701,6 +818,7 @@ static const struct sd_desc sd_desc = {
>> /* -- module initialisation -- */
>> static const struct usb_device_id device_table[] = {
>> {USB_DEVICE(0x0458, 0x7005)}, /* Genius Smart 300, version 2 */
>> + {USB_DEVICE(0x0458, 0x7003)}, /* Genius Videocam Live v2 */
>> /* The Genius Smart is untested. I can't find an owner ! */
>> /* {USB_DEVICE(0x0c45, 0x8000)}, DC31VC, Don't know this camera */
>> {USB_DEVICE(0x0c45, 0x8001)}, /* Wild Planet digital spy cam */
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2
2015-05-20 12:12 ` Mauro Carvalho Chehab
2015-05-20 17:48 ` Hans de Goede
@ 2015-05-20 18:48 ` Vasily Khoruzhick
1 sibling, 0 replies; 8+ messages in thread
From: Vasily Khoruzhick @ 2015-05-20 18:48 UTC (permalink / raw)
To: Mauro Carvalho Chehab; +Cc: Hans de Goede, Linux Media Mailing List
Hi Mauro,
On Wed, May 20, 2015 at 3:12 PM, Mauro Carvalho Chehab
<mchehab@osg.samsung.com> wrote:
> Em Fri, 24 Apr 2015 10:04:03 +0300
> Vasily Khoruzhick <anarsoul@gmail.com> escreveu:
>> diff --git a/drivers/media/usb/gspca/sn9c2028.c b/drivers/media/usb/gspca/sn9c2028.c
>> index 39b6b2e..317b02c 100644
>> --- a/drivers/media/usb/gspca/sn9c2028.c
>> +++ b/drivers/media/usb/gspca/sn9c2028.c
>> @@ -2,6 +2,7 @@
>> * SN9C2028 library
>> *
>> * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
>> + * Copyright (C) 2015 Vasily Khoruzhick <anarsoul@gmail.com>
>
> Hmm... adding a new copyright driver-wide only justifies if you changed 30%
> or more of the code. The copyright of your changes will be preserved at
> the git history.
OK, not a problem.
Regards,
Vasily
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2015-05-20 18:48 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-24 7:04 [PATCH v2 1/2] gspca: sn9c2028: Add support for Genius Videocam Live v2 Vasily Khoruzhick
2015-04-24 7:04 ` [PATCH v2 2/2] gspca: sn9c2028: Add gain and autogain controls " Vasily Khoruzhick
2015-05-15 15:55 ` [PATCH v2 1/2] gspca: sn9c2028: Add support for " Vasily Khoruzhick
2015-05-15 17:51 ` Hans de Goede
2015-05-15 18:26 ` Vasily Khoruzhick
2015-05-20 12:12 ` Mauro Carvalho Chehab
2015-05-20 17:48 ` Hans de Goede
2015-05-20 18:48 ` Vasily Khoruzhick
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.