Browse Source

V4L/DVB (9123): gspca: Add some lost controls to the s5k83a 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>
Erik Andren 16 years ago
parent
commit
18f8fae198

+ 91 - 1
drivers/media/video/gspca/m5602/m5602_s5k83a.c

@@ -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 err = 0;
+	int err;
 	u8 data[2];
 	struct sd *sd = (struct sd *) gspca_dev;
 
@@ -331,3 +331,93 @@ int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
 
 	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;
+}

+ 49 - 9
drivers/media/video/gspca/m5602/m5602_s5k83a.h

@@ -21,15 +21,20 @@
 
 #include "m5602_sensor.h"
 
-#define S5K83A_PAGE_MAP			0xec
-#define S5K83A_GAIN			0x18
+#define S5K83A_FLIP				0x01
+#define S5K83A_HFLIP_TUNE		0x03
+#define S5K83A_VFLIP_TUNE		0x05
 #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_WHITENESS	0x7e
-#define S5K83A_DEFAULT_GAIN		0x00
-#define S5K83A_MAXIMUM_GAIN		0x3c
+#define S5K83A_DEFAULT_GAIN			0x00
+#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);
 int s5k83a_get_whiteness(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_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 = {
 	.name = "S5K83A",
@@ -65,7 +75,7 @@ static struct m5602_sensor s5k83a = {
 	.read_sensor = s5k83a_read_sensor,
 	.write_sensor = s5k83a_write_sensor,
 	.i2c_slave_id = 0x5a,
-	.nctrls = 3,
+	.nctrls = 5,
 	.ctrls = {
 	{
 		{
@@ -107,7 +117,31 @@ static struct m5602_sensor s5k83a = {
 		},
 			.set = s5k83a_set_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,
 	.modes = {
@@ -121,7 +155,6 @@ static struct m5602_sensor s5k83a = {
 		.bytesperline = M5602_DEFAULT_FRAME_WIDTH,
 		.colorspace = V4L2_COLORSPACE_SRGB,
 		.priv = 1
-
 	}
 	}
 };
@@ -438,7 +471,14 @@ static const unsigned char init_s5k83a[][4] =
 	{SENSOR, S5K83A_WHITENESS, S5K83A_DEFAULT_WHITENESS, 0x00},
 
 	/* 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