mirror of
https://github.com/torvalds/linux.git
synced 2024-12-17 00:21:32 +00:00
V4L/DVB (9281): gspca: Add hflip and vflip to the po1030 sensor
Signed-off-by: Erik Andren <erik.andren@gmail.com> Signed-off-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
17ea88ae95
commit
e2c974919f
@ -1,4 +1,3 @@
|
||||
|
||||
/*
|
||||
* Driver for the po1030 sensor
|
||||
*
|
||||
@ -232,6 +231,70 @@ int po1030_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
|
||||
return (err < 0) ? err : 0;
|
||||
}
|
||||
|
||||
int po1030_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
|
||||
{
|
||||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
u8 i2c_data;
|
||||
int err;
|
||||
|
||||
err = po1030_read_sensor(sd, PO1030_REG_CONTROL2,
|
||||
&i2c_data, 1);
|
||||
|
||||
*val = (i2c_data >> 7) & 0x01 ;
|
||||
|
||||
PDEBUG(D_V4L2, "Read hflip %d", *val);
|
||||
|
||||
return (err < 0) ? err : 0;
|
||||
}
|
||||
|
||||
int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
|
||||
{
|
||||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
u8 i2c_data;
|
||||
int err;
|
||||
|
||||
PDEBUG(D_V4L2, "Set hflip %d", val);
|
||||
|
||||
i2c_data = (val & 0x01) << 7;
|
||||
|
||||
err = po1030_write_sensor(sd, PO1030_REG_CONTROL2,
|
||||
&i2c_data, 1);
|
||||
|
||||
return (err < 0) ? err : 0;
|
||||
}
|
||||
|
||||
int po1030_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
|
||||
{
|
||||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
u8 i2c_data;
|
||||
int err;
|
||||
|
||||
err = po1030_read_sensor(sd, PO1030_REG_GLOBALGAIN,
|
||||
&i2c_data, 1);
|
||||
|
||||
*val = (i2c_data >> 6) & 0x01;
|
||||
|
||||
PDEBUG(D_V4L2, "Read vflip %d", *val);
|
||||
|
||||
return (err < 0) ? err : 0;
|
||||
}
|
||||
|
||||
int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
|
||||
{
|
||||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
u8 i2c_data;
|
||||
int err;
|
||||
|
||||
PDEBUG(D_V4L2, "Set vflip %d", val);
|
||||
|
||||
i2c_data = (val & 0x01) << 6;
|
||||
|
||||
err = po1030_write_sensor(sd, PO1030_REG_CONTROL2,
|
||||
&i2c_data, 1);
|
||||
|
||||
return (err < 0) ? err : 0;
|
||||
}
|
||||
|
||||
int po1030_set_gain(struct gspca_dev *gspca_dev, __s32 val)
|
||||
{
|
||||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
|
@ -108,10 +108,13 @@
|
||||
#define PO1030_REG_YCONTRAST 0x74
|
||||
#define PO1030_REG_YSATURATION 0x75
|
||||
|
||||
#define PO1030_HFLIP (1 << 7)
|
||||
#define PO1030_VFLIP (1 << 6)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define PO1030_GLOBAL_GAIN_DEFAULT 0x12
|
||||
#define PO1030_EXPOSURE_DEFAULT 0xf0ff
|
||||
#define PO1030_EXPOSURE_DEFAULT 0x0085
|
||||
#define PO1030_BLUE_GAIN_DEFAULT 0x40
|
||||
#define PO1030_RED_GAIN_DEFAULT 0x40
|
||||
|
||||
@ -120,7 +123,6 @@
|
||||
/* Kernel module parameters */
|
||||
extern int force_sensor;
|
||||
extern int dump_sensor;
|
||||
extern unsigned int m5602_debug;
|
||||
|
||||
int po1030_probe(struct sd *sd);
|
||||
int po1030_init(struct sd *sd);
|
||||
@ -141,6 +143,10 @@ int po1030_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val);
|
||||
int po1030_set_red_balance(struct gspca_dev *gspca_dev, __s32 val);
|
||||
int po1030_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val);
|
||||
int po1030_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val);
|
||||
int po1030_get_hflip(struct gspca_dev *gspca_dev, __s32 *val);
|
||||
int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
|
||||
int po1030_get_vflip(struct gspca_dev *gspca_dev, __s32 *val);
|
||||
int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val);
|
||||
|
||||
static struct m5602_sensor po1030 = {
|
||||
.name = "PO1030",
|
||||
@ -151,7 +157,7 @@ static struct m5602_sensor po1030 = {
|
||||
.init = po1030_init,
|
||||
.power_down = po1030_power_down,
|
||||
|
||||
.nctrls = 4,
|
||||
.nctrls = 6,
|
||||
.ctrls = {
|
||||
{
|
||||
{
|
||||
@ -159,7 +165,7 @@ static struct m5602_sensor po1030 = {
|
||||
.type = V4L2_CTRL_TYPE_INTEGER,
|
||||
.name = "gain",
|
||||
.minimum = 0x00,
|
||||
.maximum = 0xff,
|
||||
.maximum = 0x4f,
|
||||
.step = 0x1,
|
||||
.default_value = PO1030_GLOBAL_GAIN_DEFAULT,
|
||||
.flags = V4L2_CTRL_FLAG_SLIDER
|
||||
@ -172,7 +178,7 @@ static struct m5602_sensor po1030 = {
|
||||
.type = V4L2_CTRL_TYPE_INTEGER,
|
||||
.name = "exposure",
|
||||
.minimum = 0x00,
|
||||
.maximum = 0xffff,
|
||||
.maximum = 0x02ff,
|
||||
.step = 0x1,
|
||||
.default_value = PO1030_EXPOSURE_DEFAULT,
|
||||
.flags = V4L2_CTRL_FLAG_SLIDER
|
||||
@ -205,8 +211,33 @@ static struct m5602_sensor po1030 = {
|
||||
},
|
||||
.set = po1030_set_blue_balance,
|
||||
.get = po1030_get_blue_balance
|
||||
}, {
|
||||
{
|
||||
.id = V4L2_CID_HFLIP,
|
||||
.type = V4L2_CTRL_TYPE_BOOLEAN,
|
||||
.name = "horizontal flip",
|
||||
.minimum = 0,
|
||||
.maximum = 1,
|
||||
.step = 1,
|
||||
.default_value = 0,
|
||||
},
|
||||
.set = po1030_set_hflip,
|
||||
.get = po1030_get_hflip
|
||||
}, {
|
||||
{
|
||||
.id = V4L2_CID_VFLIP,
|
||||
.type = V4L2_CTRL_TYPE_BOOLEAN,
|
||||
.name = "vertical flip",
|
||||
.minimum = 0,
|
||||
.maximum = 1,
|
||||
.step = 1,
|
||||
.default_value = 0,
|
||||
},
|
||||
.set = po1030_set_vflip,
|
||||
.get = po1030_get_vflip
|
||||
}
|
||||
},
|
||||
|
||||
.nmodes = 1,
|
||||
.modes = {
|
||||
{
|
||||
@ -380,7 +411,7 @@ static const unsigned char init_po1030[][4] =
|
||||
|
||||
/* Set the y window to 1 */
|
||||
{SENSOR, PO1030_REG_WINDOWY_H, 0x00},
|
||||
{SENSOR, PO1030_REG_WINDOWX_L, 0x01},
|
||||
{SENSOR, PO1030_REG_WINDOWY_L, 0x01},
|
||||
|
||||
{SENSOR, PO1030_REG_WINDOWWIDTH_H, 0x02},
|
||||
{SENSOR, PO1030_REG_WINDOWWIDTH_L, 0x87},
|
||||
|
Loading…
Reference in New Issue
Block a user