Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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

parent 1abe4746
Loading
Loading
Loading
Loading
+91 −1
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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_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_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,6 +117,30 @@ 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,
@@ -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