Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 174104
b: refs/heads/master
c: 265a809
h: refs/heads/master
v: v3
  • Loading branch information
Márton Németh authored and Mauro Carvalho Chehab committed Dec 5, 2009
1 parent b2d8142 commit a0ddf22
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d5aa3856fd09ad0ea04619d6cba31192dac08e84
refs/heads/master: 265a8098e75e156985abfaac250ee4f2b407f863
126 changes: 126 additions & 0 deletions trunk/drivers/media/video/gspca/pac7302.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,20 @@
-/0x27 Seems to toggle various gains on / off, Setting bit 7 seems to
completely disable the analog amplification block. Set to 0x68
for max gain, 0x14 for minimal gain.
The registers are accessed in the following functions:
Page | Register | Function
-----+------------+---------------------------------------------------
0 | 0x0f..0x20 | setcolors()
0 | 0xa2..0xab | setbrightcont()
0 | 0xc5 | setredbalance()
0 | 0xc7 | setbluebalance()
0 | 0xdc | setbrightcont(), setcolors()
3 | 0x02 | setexposure()
3 | 0x10 | setgain()
3 | 0x11 | setcolors(), setgain(), setexposure(), sethvflip()
3 | 0x21 | sethvflip()
*/

#define MODULE_NAME "pac7302"
Expand All @@ -66,6 +80,8 @@ struct sd {
unsigned char brightness;
unsigned char contrast;
unsigned char colors;
unsigned char red_balance;
unsigned char blue_balance;
unsigned char gain;
unsigned char exposure;
unsigned char autogain;
Expand All @@ -85,6 +101,10 @@ static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val);
static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val);
static int sd_setredbalance(struct gspca_dev *gspca_dev, __s32 val);
static int sd_getredbalance(struct gspca_dev *gspca_dev, __s32 *val);
static int sd_setbluebalance(struct gspca_dev *gspca_dev, __s32 val);
static int sd_getbluebalance(struct gspca_dev *gspca_dev, __s32 *val);
static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val);
static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val);
static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val);
Expand Down Expand Up @@ -145,6 +165,34 @@ static struct ctrl sd_ctrls[] = {
.set = sd_setcolors,
.get = sd_getcolors,
},
{
{
.id = V4L2_CID_RED_BALANCE,
.type = V4L2_CTRL_TYPE_INTEGER,
.name = "Red",
.minimum = 0,
.maximum = 3,
.step = 1,
#define REDBALANCE_DEF 1
.default_value = REDBALANCE_DEF,
},
.set = sd_setredbalance,
.get = sd_getredbalance,
},
{
{
.id = V4L2_CID_BLUE_BALANCE,
.type = V4L2_CTRL_TYPE_INTEGER,
.name = "Blue",
.minimum = 0,
.maximum = 3,
.step = 1,
#define BLUEBALANCE_DEF 1
.default_value = BLUEBALANCE_DEF,
},
.set = sd_setbluebalance,
.get = sd_getbluebalance,
},
/* All controls below are for both the 7302 and the 7311 */
{
{
Expand Down Expand Up @@ -477,6 +525,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
sd->brightness = BRIGHTNESS_DEF;
sd->contrast = CONTRAST_DEF;
sd->colors = COLOR_DEF;
sd->red_balance = REDBALANCE_DEF;
sd->blue_balance = BLUEBALANCE_DEF;
sd->gain = GAIN_DEF;
sd->exposure = EXPOSURE_DEF;
sd->autogain = AUTOGAIN_DEF;
Expand Down Expand Up @@ -545,6 +595,36 @@ static int setcolors(struct gspca_dev *gspca_dev)
return ret;
}

static int setredbalance(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
int ret;

ret = reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
if (0 <= ret)
ret = reg_w(gspca_dev, 0xc5, sd->red_balance);

if (0 <= ret)
ret = reg_w(gspca_dev, 0xdc, 0x01);
PDEBUG(D_CONF|D_STREAM, "red_balance: %i", sd->red_balance);
return ret;
}

static int setbluebalance(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
int ret;

ret = reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
if (0 <= ret)
ret = reg_w(gspca_dev, 0xc7, sd->blue_balance);

if (0 <= ret)
ret = reg_w(gspca_dev, 0xdc, 0x01);
PDEBUG(D_CONF|D_STREAM, "blue_balance: %i", sd->blue_balance);
return ret;
}

static int setgain(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
Expand Down Expand Up @@ -625,6 +705,10 @@ static int sd_start(struct gspca_dev *gspca_dev)
ret = setbrightcont(gspca_dev);
if (0 <= ret)
ret = setcolors(gspca_dev);
if (0 <= ret)
ret = setredbalance(gspca_dev);
if (0 <= ret)
ret = setbluebalance(gspca_dev);
if (0 <= ret)
setgain(gspca_dev);
if (0 <= ret)
Expand Down Expand Up @@ -857,6 +941,48 @@ static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val)
return 0;
}

static int sd_setredbalance(struct gspca_dev *gspca_dev, __s32 val)
{
struct sd *sd = (struct sd *) gspca_dev;
int ret = 0;

sd->red_balance = val;
if (gspca_dev->streaming)
ret = setredbalance(gspca_dev);
if (0 <= ret)
ret = 0;
return ret;
}

static int sd_getredbalance(struct gspca_dev *gspca_dev, __s32 *val)
{
struct sd *sd = (struct sd *) gspca_dev;

*val = sd->red_balance;
return 0;
}

static int sd_setbluebalance(struct gspca_dev *gspca_dev, __s32 val)
{
struct sd *sd = (struct sd *) gspca_dev;
int ret = 0;

sd->blue_balance = val;
if (gspca_dev->streaming)
ret = setbluebalance(gspca_dev);
if (0 <= ret)
ret = 0;
return ret;
}

static int sd_getbluebalance(struct gspca_dev *gspca_dev, __s32 *val)
{
struct sd *sd = (struct sd *) gspca_dev;

*val = sd->blue_balance;
return 0;
}

static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val)
{
struct sd *sd = (struct sd *) gspca_dev;
Expand Down

0 comments on commit a0ddf22

Please sign in to comment.