Commit e0fde595 authored by Antonio Ospite's avatar Antonio Ospite Committed by Mauro Carvalho Chehab

[media] gspca - ov534: Add Saturation control

Also merge the "COLORS" control into it as it was V4L2_CID_SATURATION
anyway.
Signed-off-by: default avatarAntonio Ospite <ospite@studenti.unina.it>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 6a6c70b8
...@@ -53,6 +53,7 @@ MODULE_LICENSE("GPL"); ...@@ -53,6 +53,7 @@ MODULE_LICENSE("GPL");
/* controls */ /* controls */
enum e_ctrl { enum e_ctrl {
SATURATION,
BRIGHTNESS, BRIGHTNESS,
CONTRAST, CONTRAST,
GAIN, GAIN,
...@@ -63,7 +64,6 @@ enum e_ctrl { ...@@ -63,7 +64,6 @@ enum e_ctrl {
SHARPNESS, SHARPNESS,
HFLIP, HFLIP,
VFLIP, VFLIP,
COLORS,
LIGHTFREQ, LIGHTFREQ,
NCTRLS /* number of controls */ NCTRLS /* number of controls */
}; };
...@@ -87,6 +87,7 @@ enum sensors { ...@@ -87,6 +87,7 @@ enum sensors {
}; };
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
static void setsaturation(struct gspca_dev *gspca_dev);
static void setbrightness(struct gspca_dev *gspca_dev); static void setbrightness(struct gspca_dev *gspca_dev);
static void setcontrast(struct gspca_dev *gspca_dev); static void setcontrast(struct gspca_dev *gspca_dev);
static void setgain(struct gspca_dev *gspca_dev); static void setgain(struct gspca_dev *gspca_dev);
...@@ -96,13 +97,24 @@ static void setawb(struct gspca_dev *gspca_dev); ...@@ -96,13 +97,24 @@ static void setawb(struct gspca_dev *gspca_dev);
static void setaec(struct gspca_dev *gspca_dev); static void setaec(struct gspca_dev *gspca_dev);
static void setsharpness(struct gspca_dev *gspca_dev); static void setsharpness(struct gspca_dev *gspca_dev);
static void sethvflip(struct gspca_dev *gspca_dev); static void sethvflip(struct gspca_dev *gspca_dev);
static void setcolors(struct gspca_dev *gspca_dev);
static void setlightfreq(struct gspca_dev *gspca_dev); static void setlightfreq(struct gspca_dev *gspca_dev);
static int sd_start(struct gspca_dev *gspca_dev); static int sd_start(struct gspca_dev *gspca_dev);
static void sd_stopN(struct gspca_dev *gspca_dev); static void sd_stopN(struct gspca_dev *gspca_dev);
static const struct ctrl sd_ctrls[] = { static const struct ctrl sd_ctrls[] = {
[SATURATION] = {
{
.id = V4L2_CID_SATURATION,
.type = V4L2_CTRL_TYPE_INTEGER,
.name = "Saturation",
.minimum = 0,
.maximum = 255,
.step = 1,
.default_value = 64,
},
.set_control = setsaturation
},
[BRIGHTNESS] = { [BRIGHTNESS] = {
{ {
.id = V4L2_CID_BRIGHTNESS, .id = V4L2_CID_BRIGHTNESS,
...@@ -223,18 +235,6 @@ static const struct ctrl sd_ctrls[] = { ...@@ -223,18 +235,6 @@ static const struct ctrl sd_ctrls[] = {
}, },
.set_control = sethvflip .set_control = sethvflip
}, },
[COLORS] = {
{
.id = V4L2_CID_SATURATION,
.type = V4L2_CTRL_TYPE_INTEGER,
.name = "Saturation",
.minimum = 0,
.maximum = 6,
.step = 1,
.default_value = 3,
},
.set_control = setcolors
},
[LIGHTFREQ] = { [LIGHTFREQ] = {
{ {
.id = V4L2_CID_POWER_LINE_FREQUENCY, .id = V4L2_CID_POWER_LINE_FREQUENCY,
...@@ -684,7 +684,7 @@ static const u8 sensor_init_772x[][2] = { ...@@ -684,7 +684,7 @@ static const u8 sensor_init_772x[][2] = {
{ 0x9c, 0x20 }, { 0x9c, 0x20 },
{ 0x9e, 0x81 }, { 0x9e, 0x81 },
{ 0xa6, 0x04 }, { 0xa6, 0x06 },
{ 0x7e, 0x0c }, { 0x7e, 0x0c },
{ 0x7f, 0x16 }, { 0x7f, 0x16 },
{ 0x80, 0x2a }, { 0x80, 0x2a },
...@@ -955,6 +955,32 @@ static void set_frame_rate(struct gspca_dev *gspca_dev) ...@@ -955,6 +955,32 @@ static void set_frame_rate(struct gspca_dev *gspca_dev)
PDEBUG(D_PROBE, "frame_rate: %d", r->fps); PDEBUG(D_PROBE, "frame_rate: %d", r->fps);
} }
static void setsaturation(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
int val;
val = sd->ctrls[SATURATION].val;
if (sd->sensor == SENSOR_OV767x) {
int i;
static u8 color_tb[][6] = {
{0x42, 0x42, 0x00, 0x11, 0x30, 0x41},
{0x52, 0x52, 0x00, 0x16, 0x3c, 0x52},
{0x66, 0x66, 0x00, 0x1b, 0x4b, 0x66},
{0x80, 0x80, 0x00, 0x22, 0x5e, 0x80},
{0x9a, 0x9a, 0x00, 0x29, 0x71, 0x9a},
{0xb8, 0xb8, 0x00, 0x31, 0x87, 0xb8},
{0xdd, 0xdd, 0x00, 0x3b, 0xa2, 0xdd},
};
for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++)
sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]);
} else {
sccb_reg_write(gspca_dev, 0xa7, val); /* U saturation */
sccb_reg_write(gspca_dev, 0xa8, val); /* V saturation */
}
}
static void setbrightness(struct gspca_dev *gspca_dev) static void setbrightness(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -1132,26 +1158,6 @@ static void sethvflip(struct gspca_dev *gspca_dev) ...@@ -1132,26 +1158,6 @@ static void sethvflip(struct gspca_dev *gspca_dev)
} }
} }
static void setcolors(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
u8 val;
int i;
static u8 color_tb[][6] = {
{0x42, 0x42, 0x00, 0x11, 0x30, 0x41},
{0x52, 0x52, 0x00, 0x16, 0x3c, 0x52},
{0x66, 0x66, 0x00, 0x1b, 0x4b, 0x66},
{0x80, 0x80, 0x00, 0x22, 0x5e, 0x80},
{0x9a, 0x9a, 0x00, 0x29, 0x71, 0x9a},
{0xb8, 0xb8, 0x00, 0x31, 0x87, 0xb8},
{0xdd, 0xdd, 0x00, 0x3b, 0xa2, 0xdd},
};
val = sd->ctrls[COLORS].val;
for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++)
sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]);
}
static void setlightfreq(struct gspca_dev *gspca_dev) static void setlightfreq(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -1228,6 +1234,9 @@ static int sd_init(struct gspca_dev *gspca_dev) ...@@ -1228,6 +1234,9 @@ static int sd_init(struct gspca_dev *gspca_dev)
gspca_dev->ctrl_dis = (1 << GAIN) | gspca_dev->ctrl_dis = (1 << GAIN) |
(1 << AGC) | (1 << AGC) |
(1 << SHARPNESS); /* auto */ (1 << SHARPNESS); /* auto */
sd->ctrls[SATURATION].min = 0,
sd->ctrls[SATURATION].max = 6,
sd->ctrls[SATURATION].def = 3,
sd->ctrls[BRIGHTNESS].min = -127; sd->ctrls[BRIGHTNESS].min = -127;
sd->ctrls[BRIGHTNESS].max = 127; sd->ctrls[BRIGHTNESS].max = 127;
sd->ctrls[BRIGHTNESS].def = 0; sd->ctrls[BRIGHTNESS].def = 0;
...@@ -1243,7 +1252,6 @@ static int sd_init(struct gspca_dev *gspca_dev) ...@@ -1243,7 +1252,6 @@ static int sd_init(struct gspca_dev *gspca_dev)
gspca_dev->cam.nmodes = ARRAY_SIZE(ov767x_mode); gspca_dev->cam.nmodes = ARRAY_SIZE(ov767x_mode);
} else { } else {
sd->sensor = SENSOR_OV772x; sd->sensor = SENSOR_OV772x;
gspca_dev->ctrl_dis = (1 << COLORS);
gspca_dev->cam.bulk = 1; gspca_dev->cam.bulk = 1;
gspca_dev->cam.bulk_size = 16384; gspca_dev->cam.bulk_size = 16384;
gspca_dev->cam.bulk_nurbs = 2; gspca_dev->cam.bulk_nurbs = 2;
...@@ -1302,6 +1310,7 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1302,6 +1310,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
set_frame_rate(gspca_dev); set_frame_rate(gspca_dev);
setsaturation(gspca_dev);
if (!(gspca_dev->ctrl_dis & (1 << AGC))) if (!(gspca_dev->ctrl_dis & (1 << AGC)))
setagc(gspca_dev); setagc(gspca_dev);
setawb(gspca_dev); setawb(gspca_dev);
...@@ -1314,8 +1323,6 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1314,8 +1323,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
if (!(gspca_dev->ctrl_dis & (1 << SHARPNESS))) if (!(gspca_dev->ctrl_dis & (1 << SHARPNESS)))
setsharpness(gspca_dev); setsharpness(gspca_dev);
sethvflip(gspca_dev); sethvflip(gspca_dev);
if (!(gspca_dev->ctrl_dis & (1 << COLORS)))
setcolors(gspca_dev);
setlightfreq(gspca_dev); setlightfreq(gspca_dev);
ov534_set_led(gspca_dev, 1); ov534_set_led(gspca_dev, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment