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

Commit e0fde595 authored by Antonio Ospite's avatar Antonio Ospite Committed by Mauro Carvalho Chehab
Browse files

[media] gspca - ov534: Add Saturation control



Also merge the "COLORS" control into it as it was V4L2_CID_SATURATION
anyway.

Signed-off-by: default avatarAntonio Ospite <ospite@studenti.unina.it>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 6a6c70b8
Loading
Loading
Loading
Loading
+45 −38
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ MODULE_LICENSE("GPL");

/* controls */
enum e_ctrl {
	SATURATION,
	BRIGHTNESS,
	CONTRAST,
	GAIN,
@@ -63,7 +64,6 @@ enum e_ctrl {
	SHARPNESS,
	HFLIP,
	VFLIP,
	COLORS,
	LIGHTFREQ,
	NCTRLS		/* number of controls */
};
@@ -87,6 +87,7 @@ enum sensors {
};

/* V4L2 controls supported by the driver */
static void setsaturation(struct gspca_dev *gspca_dev);
static void setbrightness(struct gspca_dev *gspca_dev);
static void setcontrast(struct gspca_dev *gspca_dev);
static void setgain(struct gspca_dev *gspca_dev);
@@ -96,13 +97,24 @@ static void setawb(struct gspca_dev *gspca_dev);
static void setaec(struct gspca_dev *gspca_dev);
static void setsharpness(struct gspca_dev *gspca_dev);
static void sethvflip(struct gspca_dev *gspca_dev);
static void setcolors(struct gspca_dev *gspca_dev);
static void setlightfreq(struct gspca_dev *gspca_dev);

static int sd_start(struct gspca_dev *gspca_dev);
static void sd_stopN(struct gspca_dev *gspca_dev);

static const struct ctrl sd_ctrls[] = {
[SATURATION] = {
		{
			.id      = V4L2_CID_SATURATION,
			.type    = V4L2_CTRL_TYPE_INTEGER,
			.name    = "Saturation",
			.minimum = 0,
			.maximum = 255,
			.step    = 1,
			.default_value = 64,
		},
		.set_control = setsaturation
	},
[BRIGHTNESS] = {
		{
			.id      = V4L2_CID_BRIGHTNESS,
@@ -223,18 +235,6 @@ static const struct ctrl sd_ctrls[] = {
		},
		.set_control = sethvflip
	},
[COLORS] = {
		{
			.id      = V4L2_CID_SATURATION,
			.type    = V4L2_CTRL_TYPE_INTEGER,
			.name    = "Saturation",
			.minimum = 0,
			.maximum = 6,
			.step    = 1,
			.default_value = 3,
		},
		.set_control = setcolors
	},
[LIGHTFREQ] = {
		{
			.id      = V4L2_CID_POWER_LINE_FREQUENCY,
@@ -684,7 +684,7 @@ static const u8 sensor_init_772x[][2] = {
	{ 0x9c, 0x20 },
	{ 0x9e, 0x81 },

	{ 0xa6, 0x04 },
	{ 0xa6, 0x06 },
	{ 0x7e, 0x0c },
	{ 0x7f, 0x16 },
	{ 0x80, 0x2a },
@@ -955,6 +955,32 @@ static void set_frame_rate(struct gspca_dev *gspca_dev)
	PDEBUG(D_PROBE, "frame_rate: %d", r->fps);
}

static void setsaturation(struct gspca_dev *gspca_dev)
{
	struct sd *sd = (struct sd *) gspca_dev;
	int val;

	val = sd->ctrls[SATURATION].val;
	if (sd->sensor == SENSOR_OV767x) {
		int i;
		static u8 color_tb[][6] = {
			{0x42, 0x42, 0x00, 0x11, 0x30, 0x41},
			{0x52, 0x52, 0x00, 0x16, 0x3c, 0x52},
			{0x66, 0x66, 0x00, 0x1b, 0x4b, 0x66},
			{0x80, 0x80, 0x00, 0x22, 0x5e, 0x80},
			{0x9a, 0x9a, 0x00, 0x29, 0x71, 0x9a},
			{0xb8, 0xb8, 0x00, 0x31, 0x87, 0xb8},
			{0xdd, 0xdd, 0x00, 0x3b, 0xa2, 0xdd},
		};

		for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++)
			sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]);
	} else {
		sccb_reg_write(gspca_dev, 0xa7, val); /* U saturation */
		sccb_reg_write(gspca_dev, 0xa8, val); /* V saturation */
	}
}

static void setbrightness(struct gspca_dev *gspca_dev)
{
	struct sd *sd = (struct sd *) gspca_dev;
@@ -1132,26 +1158,6 @@ static void sethvflip(struct gspca_dev *gspca_dev)
	}
}

static void setcolors(struct gspca_dev *gspca_dev)
{
	struct sd *sd = (struct sd *) gspca_dev;
	u8 val;
	int i;
	static u8 color_tb[][6] = {
		{0x42, 0x42, 0x00, 0x11, 0x30, 0x41},
		{0x52, 0x52, 0x00, 0x16, 0x3c, 0x52},
		{0x66, 0x66, 0x00, 0x1b, 0x4b, 0x66},
		{0x80, 0x80, 0x00, 0x22, 0x5e, 0x80},
		{0x9a, 0x9a, 0x00, 0x29, 0x71, 0x9a},
		{0xb8, 0xb8, 0x00, 0x31, 0x87, 0xb8},
		{0xdd, 0xdd, 0x00, 0x3b, 0xa2, 0xdd},
	};

	val = sd->ctrls[COLORS].val;
	for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++)
		sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]);
}

static void setlightfreq(struct gspca_dev *gspca_dev)
{
	struct sd *sd = (struct sd *) gspca_dev;
@@ -1228,6 +1234,9 @@ static int sd_init(struct gspca_dev *gspca_dev)
		gspca_dev->ctrl_dis = (1 << GAIN) |
					(1 << AGC) |
					(1 << SHARPNESS);	/* auto */
		sd->ctrls[SATURATION].min = 0,
		sd->ctrls[SATURATION].max = 6,
		sd->ctrls[SATURATION].def = 3,
		sd->ctrls[BRIGHTNESS].min = -127;
		sd->ctrls[BRIGHTNESS].max = 127;
		sd->ctrls[BRIGHTNESS].def = 0;
@@ -1243,7 +1252,6 @@ static int sd_init(struct gspca_dev *gspca_dev)
		gspca_dev->cam.nmodes = ARRAY_SIZE(ov767x_mode);
	} else {
		sd->sensor = SENSOR_OV772x;
		gspca_dev->ctrl_dis = (1 << COLORS);
		gspca_dev->cam.bulk = 1;
		gspca_dev->cam.bulk_size = 16384;
		gspca_dev->cam.bulk_nurbs = 2;
@@ -1302,6 +1310,7 @@ static int sd_start(struct gspca_dev *gspca_dev)

	set_frame_rate(gspca_dev);

	setsaturation(gspca_dev);
	if (!(gspca_dev->ctrl_dis & (1 << AGC)))
		setagc(gspca_dev);
	setawb(gspca_dev);
@@ -1314,8 +1323,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
	if (!(gspca_dev->ctrl_dis & (1 << SHARPNESS)))
		setsharpness(gspca_dev);
	sethvflip(gspca_dev);
	if (!(gspca_dev->ctrl_dis & (1 << COLORS)))
		setcolors(gspca_dev);
	setlightfreq(gspca_dev);

	ov534_set_led(gspca_dev, 1);