|
@@ -461,6 +461,52 @@ static void Et_init2(struct gspca_dev *gspca_dev)
|
|
|
reg_w_val(gspca_dev, 0x80, 0x20); /* 0x20; */
|
|
|
}
|
|
|
|
|
|
+static void setbrightness(struct gspca_dev *gspca_dev)
|
|
|
+{
|
|
|
+ struct sd *sd = (struct sd *) gspca_dev;
|
|
|
+ int i;
|
|
|
+ __u8 brightness = sd->brightness;
|
|
|
+
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
+ reg_w_val(gspca_dev, ET_O_RED + i, brightness);
|
|
|
+}
|
|
|
+
|
|
|
+static void getbrightness(struct gspca_dev *gspca_dev)
|
|
|
+{
|
|
|
+ struct sd *sd = (struct sd *) gspca_dev;
|
|
|
+ int i;
|
|
|
+ int brightness = 0;
|
|
|
+
|
|
|
+ for (i = 0; i < 4; i++) {
|
|
|
+ reg_r(gspca_dev, ET_O_RED + i, 1);
|
|
|
+ brightness += gspca_dev->usb_buf[0];
|
|
|
+ }
|
|
|
+ sd->brightness = brightness >> 3;
|
|
|
+}
|
|
|
+
|
|
|
+static void setcontrast(struct gspca_dev *gspca_dev)
|
|
|
+{
|
|
|
+ struct sd *sd = (struct sd *) gspca_dev;
|
|
|
+ __u8 RGBG[] = { 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 };
|
|
|
+ __u8 contrast = sd->contrast;
|
|
|
+
|
|
|
+ memset(RGBG, contrast, sizeof(RGBG) - 2);
|
|
|
+ reg_w(gspca_dev, ET_G_RED, RGBG, 6);
|
|
|
+}
|
|
|
+
|
|
|
+static void getcontrast(struct gspca_dev *gspca_dev)
|
|
|
+{
|
|
|
+ struct sd *sd = (struct sd *) gspca_dev;
|
|
|
+ int i;
|
|
|
+ int contrast = 0;
|
|
|
+
|
|
|
+ for (i = 0; i < 4; i++) {
|
|
|
+ reg_r(gspca_dev, ET_G_RED + i, 1);
|
|
|
+ contrast += gspca_dev->usb_buf[0];
|
|
|
+ }
|
|
|
+ sd->contrast = contrast >> 2;
|
|
|
+}
|
|
|
+
|
|
|
static void setcolors(struct gspca_dev *gspca_dev)
|
|
|
{
|
|
|
struct sd *sd = (struct sd *) gspca_dev;
|
|
@@ -492,6 +538,16 @@ static void getcolors(struct gspca_dev *gspca_dev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void setautogain(struct gspca_dev *gspca_dev)
|
|
|
+{
|
|
|
+ struct sd *sd = (struct sd *) gspca_dev;
|
|
|
+
|
|
|
+ if (sd->autogain)
|
|
|
+ sd->ag_cnt = AG_CNT_START;
|
|
|
+ else
|
|
|
+ sd->ag_cnt = -1;
|
|
|
+}
|
|
|
+
|
|
|
static void Et_init1(struct gspca_dev *gspca_dev)
|
|
|
{
|
|
|
__u8 value;
|
|
@@ -614,6 +670,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
|
|
|
sd->contrast = CONTRAST_DEF;
|
|
|
sd->colors = COLOR_DEF;
|
|
|
sd->autogain = AUTOGAIN_DEF;
|
|
|
+ sd->ag_cnt = -1;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -641,6 +698,8 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
|
|
else
|
|
|
Et_init2(gspca_dev);
|
|
|
|
|
|
+ setautogain(gspca_dev);
|
|
|
+
|
|
|
reg_w_val(gspca_dev, ET_RESET_ALL, 0x08);
|
|
|
et_video(gspca_dev, 1); /* video on */
|
|
|
}
|
|
@@ -658,52 +717,6 @@ static void sd_close(struct gspca_dev *gspca_dev)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
-static void setbrightness(struct gspca_dev *gspca_dev)
|
|
|
-{
|
|
|
- struct sd *sd = (struct sd *) gspca_dev;
|
|
|
- int i;
|
|
|
- __u8 brightness = sd->brightness;
|
|
|
-
|
|
|
- for (i = 0; i < 4; i++)
|
|
|
- reg_w_val(gspca_dev, ET_O_RED + i, brightness);
|
|
|
-}
|
|
|
-
|
|
|
-static void getbrightness(struct gspca_dev *gspca_dev)
|
|
|
-{
|
|
|
- struct sd *sd = (struct sd *) gspca_dev;
|
|
|
- int i;
|
|
|
- int brightness = 0;
|
|
|
-
|
|
|
- for (i = 0; i < 4; i++) {
|
|
|
- reg_r(gspca_dev, ET_O_RED + i, 1);
|
|
|
- brightness += gspca_dev->usb_buf[0];
|
|
|
- }
|
|
|
- sd->brightness = brightness >> 3;
|
|
|
-}
|
|
|
-
|
|
|
-static void setcontrast(struct gspca_dev *gspca_dev)
|
|
|
-{
|
|
|
- struct sd *sd = (struct sd *) gspca_dev;
|
|
|
- __u8 RGBG[] = { 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 };
|
|
|
- __u8 contrast = sd->contrast;
|
|
|
-
|
|
|
- memset(RGBG, contrast, sizeof(RGBG) - 2);
|
|
|
- reg_w(gspca_dev, ET_G_RED, RGBG, 6);
|
|
|
-}
|
|
|
-
|
|
|
-static void getcontrast(struct gspca_dev *gspca_dev)
|
|
|
-{
|
|
|
- struct sd *sd = (struct sd *) gspca_dev;
|
|
|
- int i;
|
|
|
- int contrast = 0;
|
|
|
-
|
|
|
- for (i = 0; i < 4; i++) {
|
|
|
- reg_r(gspca_dev, ET_G_RED + i, 1);
|
|
|
- contrast += gspca_dev->usb_buf[0];
|
|
|
- }
|
|
|
- sd->contrast = contrast >> 2;
|
|
|
-}
|
|
|
-
|
|
|
static __u8 Et_getgainG(struct gspca_dev *gspca_dev)
|
|
|
{
|
|
|
struct sd *sd = (struct sd *) gspca_dev;
|
|
@@ -733,15 +746,22 @@ static void Et_setgainG(struct gspca_dev *gspca_dev, __u8 gain)
|
|
|
#define LIMIT(color) \
|
|
|
(unsigned char)((color > 0xff)?0xff:((color < 0)?0:color))
|
|
|
|
|
|
-static void setautogain(struct gspca_dev *gspca_dev)
|
|
|
+static void do_autogain(struct gspca_dev *gspca_dev)
|
|
|
{
|
|
|
- __u8 luma = 0;
|
|
|
+ struct sd *sd = (struct sd *) gspca_dev;
|
|
|
+ __u8 luma;
|
|
|
__u8 luma_mean = 128;
|
|
|
__u8 luma_delta = 20;
|
|
|
__u8 spring = 4;
|
|
|
- int Gbright = 0;
|
|
|
+ int Gbright;
|
|
|
__u8 r, g, b;
|
|
|
|
|
|
+ if (sd->ag_cnt < 0)
|
|
|
+ return;
|
|
|
+ if (--sd->ag_cnt >= 0)
|
|
|
+ return;
|
|
|
+ sd->ag_cnt = AG_CNT_START;
|
|
|
+
|
|
|
Gbright = Et_getgainG(gspca_dev);
|
|
|
reg_r(gspca_dev, ET_LUMA_CENTER, 4);
|
|
|
g = (gspca_dev->usb_buf[0] + gspca_dev->usb_buf[3]) >> 1;
|
|
@@ -768,7 +788,6 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
|
|
|
__u8 *data, /* isoc packet */
|
|
|
int len) /* iso packet length */
|
|
|
{
|
|
|
- struct sd *sd;
|
|
|
int seqframe;
|
|
|
|
|
|
seqframe = data[0] & 0x3f;
|
|
@@ -783,13 +802,6 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
|
|
|
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,
|
|
|
data, 0);
|
|
|
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len);
|
|
|
- sd = (struct sd *) gspca_dev;
|
|
|
- if (sd->ag_cnt >= 0) {
|
|
|
- if (--sd->ag_cnt < 0) {
|
|
|
- sd->ag_cnt = AG_CNT_START;
|
|
|
- setautogain(gspca_dev);
|
|
|
- }
|
|
|
- }
|
|
|
return;
|
|
|
}
|
|
|
if (len) {
|
|
@@ -862,10 +874,8 @@ static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
|
|
|
struct sd *sd = (struct sd *) gspca_dev;
|
|
|
|
|
|
sd->autogain = val;
|
|
|
- if (val)
|
|
|
- sd->ag_cnt = AG_CNT_START;
|
|
|
- else
|
|
|
- sd->ag_cnt = -1;
|
|
|
+ if (gspca_dev->streaming)
|
|
|
+ setautogain(gspca_dev);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -889,6 +899,7 @@ static struct sd_desc sd_desc = {
|
|
|
.stop0 = sd_stop0,
|
|
|
.close = sd_close,
|
|
|
.pkt_scan = sd_pkt_scan,
|
|
|
+ .dq_callback = do_autogain,
|
|
|
};
|
|
|
|
|
|
/* -- module initialisation -- */
|