Commit 18f8fae1 authored by Erik Andren's avatar Erik Andren Committed by Mauro Carvalho Chehab

V4L/DVB (9123): gspca: Add some lost controls to the s5k83a sensor.

Signed-off-by: default avatarErik Andren <erik.andren@gmail.com>
Signed-off-by: default avatarJean-Francois Moine <moinejf@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 1abe4746
...@@ -321,7 +321,7 @@ int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val) ...@@ -321,7 +321,7 @@ int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val) int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
{ {
int err = 0; int err;
u8 data[2]; u8 data[2];
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -331,3 +331,93 @@ int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val) ...@@ -331,3 +331,93 @@ int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
return (err < 0) ? err : 0; return (err < 0) ? err : 0;
} }
int s5k83a_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
{
int err;
u8 data[1];
struct sd *sd = (struct sd *) gspca_dev;
data[0] = 0x05;
err = s5k83a_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
if (err < 0)
return err;
err = s5k83a_read_sensor(sd, S5K83A_FLIP, data, 1);
*val = (data[0] | 0x40) ? 1 : 0;
return (err < 0) ? err : 0;
}
int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
{
int err;
u8 data[1];
struct sd *sd = (struct sd *) gspca_dev;
data[0] = 0x05;
err = s5k83a_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
if (err < 0)
return err;
err = s5k83a_read_sensor(sd, S5K83A_FLIP, data, 1);
if (err < 0)
return err;
/* set or zero six bit, seven is hflip */
data[0] = (val) ? (data[0] & 0x80) | 0x40 | S5K83A_FLIP_MASK
: (data[0] & 0x80) | S5K83A_FLIP_MASK;
err = s5k83a_write_sensor(sd, S5K83A_FLIP, data, 1);
if (err < 0)
return err;
data[0] = (val) ? 0x0b : 0x0a;
err = s5k83a_write_sensor(sd, S5K83A_VFLIP_TUNE, data, 1);
return (err < 0) ? err : 0;
}
int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
{
int err;
u8 data[1];
struct sd *sd = (struct sd *) gspca_dev;
data[0] = 0x05;
err = s5k83a_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
if (err < 0)
return err;
err = s5k83a_read_sensor(sd, S5K83A_FLIP, data, 1);
*val = (data[0] | 0x80) ? 1 : 0;
return (err < 0) ? err : 0;
}
int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
{
int err;
u8 data[1];
struct sd *sd = (struct sd *) gspca_dev;
data[0] = 0x05;
err = s5k83a_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
if (err < 0)
return err;
err = s5k83a_read_sensor(sd, S5K83A_FLIP, data, 1);
if (err < 0)
return err;
/* set or zero seven bit, six is vflip */
data[0] = (val) ? (data[0] & 0x40) | 0x80 | S5K83A_FLIP_MASK
: (data[0] & 0x40) | S5K83A_FLIP_MASK;
err = s5k83a_write_sensor(sd, S5K83A_FLIP, data, 1);
if (err < 0)
return err;
data[0] = (val) ? 0x0a : 0x0b;
err = s5k83a_write_sensor(sd, S5K83A_HFLIP_TUNE, data, 1);
return (err < 0) ? err : 0;
}
...@@ -21,15 +21,20 @@ ...@@ -21,15 +21,20 @@
#include "m5602_sensor.h" #include "m5602_sensor.h"
#define S5K83A_PAGE_MAP 0xec #define S5K83A_FLIP 0x01
#define S5K83A_GAIN 0x18 #define S5K83A_HFLIP_TUNE 0x03
#define S5K83A_VFLIP_TUNE 0x05
#define S5K83A_WHITENESS 0x0a #define S5K83A_WHITENESS 0x0a
#define S5K83A_BRIGHTNESS 0x1b #define S5K83A_GAIN 0x18
#define S5K83A_BRIGHTNESS 0x1b
#define S5K83A_PAGE_MAP 0xec
#define S5K83A_DEFAULT_BRIGHTNESS 0x71 #define S5K83A_DEFAULT_BRIGHTNESS 0x71
#define S5K83A_DEFAULT_WHITENESS 0x7e #define S5K83A_DEFAULT_WHITENESS 0x7e
#define S5K83A_DEFAULT_GAIN 0x00 #define S5K83A_DEFAULT_GAIN 0x00
#define S5K83A_MAXIMUM_GAIN 0x3c #define S5K83A_MAXIMUM_GAIN 0x3c
#define S5K83A_FLIP_MASK 0x10
/*****************************************************************************/ /*****************************************************************************/
...@@ -56,6 +61,11 @@ int s5k83a_set_whiteness(struct gspca_dev *gspca_dev, __s32 val); ...@@ -56,6 +61,11 @@ int s5k83a_set_whiteness(struct gspca_dev *gspca_dev, __s32 val);
int s5k83a_get_whiteness(struct gspca_dev *gspca_dev, __s32 *val); int s5k83a_get_whiteness(struct gspca_dev *gspca_dev, __s32 *val);
int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val); int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val);
int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val); int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val);
int s5k83a_get_vflip(struct gspca_dev *gspca_dev, __s32 *val);
int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val);
int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val);
int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
static struct m5602_sensor s5k83a = { static struct m5602_sensor s5k83a = {
.name = "S5K83A", .name = "S5K83A",
...@@ -65,7 +75,7 @@ static struct m5602_sensor s5k83a = { ...@@ -65,7 +75,7 @@ static struct m5602_sensor s5k83a = {
.read_sensor = s5k83a_read_sensor, .read_sensor = s5k83a_read_sensor,
.write_sensor = s5k83a_write_sensor, .write_sensor = s5k83a_write_sensor,
.i2c_slave_id = 0x5a, .i2c_slave_id = 0x5a,
.nctrls = 3, .nctrls = 5,
.ctrls = { .ctrls = {
{ {
{ {
...@@ -107,7 +117,31 @@ static struct m5602_sensor s5k83a = { ...@@ -107,7 +117,31 @@ static struct m5602_sensor s5k83a = {
}, },
.set = s5k83a_set_gain, .set = s5k83a_set_gain,
.get = s5k83a_get_gain .get = s5k83a_get_gain
} }, {
{
.id = V4L2_CID_HFLIP,
.type = V4L2_CTRL_TYPE_BOOLEAN,
.name = "horizontal flip",
.minimum = 0,
.maximum = 1,
.step = 1,
.default_value = 0
},
.set = s5k83a_set_hflip,
.get = s5k83a_get_hflip
}, {
{
.id = V4L2_CID_VFLIP,
.type = V4L2_CTRL_TYPE_BOOLEAN,
.name = "vertical flip",
.minimum = 0,
.maximum = 1,
.step = 1,
.default_value = 0
},
.set = s5k83a_set_vflip,
.get = s5k83a_get_vflip
}
}, },
.nmodes = 1, .nmodes = 1,
.modes = { .modes = {
...@@ -121,7 +155,6 @@ static struct m5602_sensor s5k83a = { ...@@ -121,7 +155,6 @@ static struct m5602_sensor s5k83a = {
.bytesperline = M5602_DEFAULT_FRAME_WIDTH, .bytesperline = M5602_DEFAULT_FRAME_WIDTH,
.colorspace = V4L2_COLORSPACE_SRGB, .colorspace = V4L2_COLORSPACE_SRGB,
.priv = 1 .priv = 1
} }
} }
}; };
...@@ -438,7 +471,14 @@ static const unsigned char init_s5k83a[][4] = ...@@ -438,7 +471,14 @@ static const unsigned char init_s5k83a[][4] =
{SENSOR, S5K83A_WHITENESS, S5K83A_DEFAULT_WHITENESS, 0x00}, {SENSOR, S5K83A_WHITENESS, S5K83A_DEFAULT_WHITENESS, 0x00},
/* set default gain */ /* set default gain */
{SENSOR_LONG, 0x18, 0x00, S5K83A_DEFAULT_GAIN} {SENSOR_LONG, 0x18, 0x00, S5K83A_DEFAULT_GAIN},
/* set default flip */
{SENSOR, S5K83A_PAGE_MAP, 0x05, 0x00},
{SENSOR, S5K83A_FLIP, 0x00 | S5K83A_FLIP_MASK, 0x00},
{SENSOR, S5K83A_HFLIP_TUNE, 0x0b, 0x00},
{SENSOR, S5K83A_VFLIP_TUNE, 0x0a, 0x00}
}; };
#endif #endif
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