From: Hans de Goede <j.w.r.degoede@hhs.nl>
To: Jean-Francois Moine <moinejf@free.fr>
Cc: video4linux-list@redhat.com
Subject: PATCH: gspca-sn9c102-sensor-gain.patch
Date: Thu, 10 Jul 2008 10:06:24 +0200 [thread overview]
Message-ID: <4875C300.1010307@hhs.nl> (raw)
[-- Attachment #1: Type: text/plain, Size: 914 bytes --]
<oops, resend with patch attached>
Hi,
Currently the sn9c102 gain control, only controls the digital gain in the
sn9c102, but most sensors have an analog gain in the sensor, allowing for a
much wider sensitivity range.
This patch adds support for the sensor gain for the tas5110 and ov6650 sensors.
Note that both gains are controlled with a single v4l2 ctrl, as they are both
gain. The ctrl now hs a range of 0-511, raising it one step at a time, will
first raise the sensor gain 1 one its 0-255 scale and then the next step will
raise the bridge gain on its 0-255 scale. Note that the bridge really has a
0-15 scale, so it only gets raised once every 32 steps
(of the full 0-511 scale).
This patch combined with the configurable exposure and autoexposure patch,
makes my 2 sn9c102 cams work well in a wide variety of lighting conditions.
Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>
Regards,
Hans
[-- Attachment #2: gspca-sn9c102-sensor-gain.patch --]
[-- Type: text/x-patch, Size: 4344 bytes --]
Currently the sn9c102 gain control, only controls the digital gain in the
sn9c102, but most sensors have an analog gain in the sensor, allowing for a
much wider sensitivity range.
This patch adds support for the sensor gain for the tas5110 and ov6650 sensors.
Note that both gains are controlled with a single v4l2 ctrl, as they are both
gain. The ctrl now hs a range of 0-511, raising it one step at a time, will
first raise the sensor gain 1 one its 0-255 scale and then the next step will
raise the bridge gain on its 0-255 scale. Note that the bridge really has a
0-15 scale, so it only gets raised once every 32 steps
(of the full 0-511 scale).
This patch combined with the configurable exposure and autoexposure patch,
makes my 2 sn9c102 cams work well in a wide variety of lighting conditions.
Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>
--- gspca/linux/drivers/media/video/gspca/sonixb.c 2008-07-09 22:42:11.000000000 +0200
+++ gspca.new/linux/drivers/media/video/gspca/sonixb.c 2008-07-09 21:21:44.000000000 +0200
@@ -39,14 +39,15 @@
sensor, so we use a per cam copy */
atomic_t avg_lum;
+ unsigned short gain;
+ unsigned short exposure;
unsigned char brightness;
- unsigned char gain;
- unsigned char exposure;
unsigned char autogain;
unsigned char autogain_ignore_frames;
unsigned char fr_h_sz; /* size of frame header */
char sensor; /* Type of image sensor chip */
+ char sensor_has_gain;
#define SENSOR_HV7131R 0
#define SENSOR_OV6650 1
#define SENSOR_OV7630 2
@@ -108,10 +109,10 @@
.type = V4L2_CTRL_TYPE_INTEGER,
.name = "Gain",
.minimum = 0,
- .maximum = 255,
+ .maximum = 511,
.step = 1,
-#define GAIN_DEF 127
-#define GAIN_KNEE 200
+#define GAIN_DEF 255
+#define GAIN_KNEE 400
.default_value = GAIN_DEF,
},
.set = sd_setgain,
@@ -124,9 +125,9 @@
.type = V4L2_CTRL_TYPE_INTEGER,
.name = "Exposure",
#define EXPOSURE_DEF 0
-#define EXPOSURE_KNEE 176 /* 10 fps */
+#define EXPOSURE_KNEE 353 /* 10 fps */
.minimum = 0,
- .maximum = 255,
+ .maximum = 511,
.step = 1,
.default_value = EXPOSURE_DEF,
.flags = 0,
@@ -541,8 +542,7 @@
goto err;
break;
}
- case SENSOR_TAS5130CXX:
- case SENSOR_TAS5110: {
+ case SENSOR_TAS5130CXX: {
__u8 i2c[] =
{0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10};
@@ -553,19 +553,54 @@
goto err;
break;
}
+ case SENSOR_TAS5110:
+ /* FIXME figure out howto control brightness on TAS5110 */
+ break;
}
return;
err:
PDEBUG(D_ERR, "i2c error brightness");
}
+static void setsensorgain(struct gspca_dev *gspca_dev)
+{
+ struct sd *sd = (struct sd *) gspca_dev;
+ unsigned short gain;
+
+ gain = (sd->gain + 1) >> 1;
+ if (gain > 255)
+ gain = 255;
+
+ switch(sd->sensor) {
+
+ case SENSOR_TAS5110: {
+ __u8 i2c[] =
+ {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10};
+
+ i2c[4] = 255 - gain;
+ if (i2c_w(gspca_dev->dev, i2c) < 0)
+ goto err;
+ break; }
+
+ case SENSOR_OV6650: {
+ __u8 i2c[] = {0xa0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
+ i2c[3] = gain;
+ if (i2c_w(gspca_dev->dev, i2c) < 0)
+ goto err;
+ break; }
+ }
+ return;
+err:
+ PDEBUG(D_ERR, "i2c error gain");
+}
+
static void setgain(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
__u8 gain;
__u8 rgb_value;
- gain = sd->gain >> 4;
+ gain = sd->gain >> 5;
/* red and blue gain */
rgb_value = gain << 4 | gain;
@@ -573,13 +608,16 @@
/* green gain */
rgb_value = gain;
reg_w(gspca_dev->dev, 0x11, &rgb_value, 1);
+
+ if (sd->sensor_has_gain)
+ setsensorgain(gspca_dev);
}
static void setexposure(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
/* translate 0 - 255 to a number of fps in a 30 - 1 scale */
- int fps = 30 - sd->exposure * 29 / 255;
+ int fps = 30 - sd->exposure * 29 / 511;
switch(sd->sensor) {
case SENSOR_TAS5110: {
@@ -649,6 +687,7 @@
case 0x6005: /* SN9C101 */
case 0x6007: /* SN9C101 */
sd->sensor = SENSOR_TAS5110;
+ sd->sensor_has_gain = 1;
sd->sd_desc.nctrls = 4;
sd->sd_desc.dq_callback = do_autogain;
sif = 1;
@@ -661,6 +700,7 @@
break;
case 0x6011: /* SN9C101 - SN9C101G */
sd->sensor = SENSOR_OV6650;
+ sd->sensor_has_gain = 1;
sd->sd_desc.nctrls = 4;
sd->sd_desc.dq_callback = do_autogain;
sif = 1;
[-- Attachment #3: Type: text/plain, Size: 164 bytes --]
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
next reply other threads:[~2008-07-10 7:59 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-10 8:06 Hans de Goede [this message]
-- strict thread matches above, loose matches on Subject: below --
2008-07-09 21:14 PATCH: gspca-sn9c102-sensor-gain.patch Hans de Goede
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4875C300.1010307@hhs.nl \
--to=j.w.r.degoede@hhs.nl \
--cc=moinejf@free.fr \
--cc=video4linux-list@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.