diff options
Diffstat (limited to 'drivers/media/video/gspca/etoms.c')
-rw-r--r-- | drivers/media/video/gspca/etoms.c | 137 |
1 files changed, 74 insertions, 63 deletions
diff --git a/drivers/media/video/gspca/etoms.c b/drivers/media/video/gspca/etoms.c index c8c2f02fcf00..1dbe92d01e6a 100644 --- a/drivers/media/video/gspca/etoms.c +++ b/drivers/media/video/gspca/etoms.c | |||
@@ -233,7 +233,7 @@ static void reg_r(struct gspca_dev *gspca_dev, | |||
233 | { | 233 | { |
234 | struct usb_device *dev = gspca_dev->dev; | 234 | struct usb_device *dev = gspca_dev->dev; |
235 | 235 | ||
236 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 236 | #ifdef GSPCA_DEBUG |
237 | if (len > sizeof gspca_dev->usb_buf) { | 237 | if (len > sizeof gspca_dev->usb_buf) { |
238 | err("reg_r: buffer overflow"); | 238 | err("reg_r: buffer overflow"); |
239 | return; | 239 | return; |
@@ -271,7 +271,7 @@ static void reg_w(struct gspca_dev *gspca_dev, | |||
271 | { | 271 | { |
272 | struct usb_device *dev = gspca_dev->dev; | 272 | struct usb_device *dev = gspca_dev->dev; |
273 | 273 | ||
274 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 274 | #ifdef GSPCA_DEBUG |
275 | if (len > sizeof gspca_dev->usb_buf) { | 275 | if (len > sizeof gspca_dev->usb_buf) { |
276 | err("reg_w: buffer overflow"); | 276 | err("reg_w: buffer overflow"); |
277 | return; | 277 | return; |
@@ -461,6 +461,52 @@ static void Et_init2(struct gspca_dev *gspca_dev) | |||
461 | reg_w_val(gspca_dev, 0x80, 0x20); /* 0x20; */ | 461 | reg_w_val(gspca_dev, 0x80, 0x20); /* 0x20; */ |
462 | } | 462 | } |
463 | 463 | ||
464 | static void setbrightness(struct gspca_dev *gspca_dev) | ||
465 | { | ||
466 | struct sd *sd = (struct sd *) gspca_dev; | ||
467 | int i; | ||
468 | __u8 brightness = sd->brightness; | ||
469 | |||
470 | for (i = 0; i < 4; i++) | ||
471 | reg_w_val(gspca_dev, ET_O_RED + i, brightness); | ||
472 | } | ||
473 | |||
474 | static void getbrightness(struct gspca_dev *gspca_dev) | ||
475 | { | ||
476 | struct sd *sd = (struct sd *) gspca_dev; | ||
477 | int i; | ||
478 | int brightness = 0; | ||
479 | |||
480 | for (i = 0; i < 4; i++) { | ||
481 | reg_r(gspca_dev, ET_O_RED + i, 1); | ||
482 | brightness += gspca_dev->usb_buf[0]; | ||
483 | } | ||
484 | sd->brightness = brightness >> 3; | ||
485 | } | ||
486 | |||
487 | static void setcontrast(struct gspca_dev *gspca_dev) | ||
488 | { | ||
489 | struct sd *sd = (struct sd *) gspca_dev; | ||
490 | __u8 RGBG[] = { 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }; | ||
491 | __u8 contrast = sd->contrast; | ||
492 | |||
493 | memset(RGBG, contrast, sizeof(RGBG) - 2); | ||
494 | reg_w(gspca_dev, ET_G_RED, RGBG, 6); | ||
495 | } | ||
496 | |||
497 | static void getcontrast(struct gspca_dev *gspca_dev) | ||
498 | { | ||
499 | struct sd *sd = (struct sd *) gspca_dev; | ||
500 | int i; | ||
501 | int contrast = 0; | ||
502 | |||
503 | for (i = 0; i < 4; i++) { | ||
504 | reg_r(gspca_dev, ET_G_RED + i, 1); | ||
505 | contrast += gspca_dev->usb_buf[0]; | ||
506 | } | ||
507 | sd->contrast = contrast >> 2; | ||
508 | } | ||
509 | |||
464 | static void setcolors(struct gspca_dev *gspca_dev) | 510 | static void setcolors(struct gspca_dev *gspca_dev) |
465 | { | 511 | { |
466 | struct sd *sd = (struct sd *) gspca_dev; | 512 | struct sd *sd = (struct sd *) gspca_dev; |
@@ -492,6 +538,16 @@ static void getcolors(struct gspca_dev *gspca_dev) | |||
492 | } | 538 | } |
493 | } | 539 | } |
494 | 540 | ||
541 | static void setautogain(struct gspca_dev *gspca_dev) | ||
542 | { | ||
543 | struct sd *sd = (struct sd *) gspca_dev; | ||
544 | |||
545 | if (sd->autogain) | ||
546 | sd->ag_cnt = AG_CNT_START; | ||
547 | else | ||
548 | sd->ag_cnt = -1; | ||
549 | } | ||
550 | |||
495 | static void Et_init1(struct gspca_dev *gspca_dev) | 551 | static void Et_init1(struct gspca_dev *gspca_dev) |
496 | { | 552 | { |
497 | __u8 value; | 553 | __u8 value; |
@@ -614,6 +670,7 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
614 | sd->contrast = CONTRAST_DEF; | 670 | sd->contrast = CONTRAST_DEF; |
615 | sd->colors = COLOR_DEF; | 671 | sd->colors = COLOR_DEF; |
616 | sd->autogain = AUTOGAIN_DEF; | 672 | sd->autogain = AUTOGAIN_DEF; |
673 | sd->ag_cnt = -1; | ||
617 | return 0; | 674 | return 0; |
618 | } | 675 | } |
619 | 676 | ||
@@ -641,6 +698,8 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
641 | else | 698 | else |
642 | Et_init2(gspca_dev); | 699 | Et_init2(gspca_dev); |
643 | 700 | ||
701 | setautogain(gspca_dev); | ||
702 | |||
644 | reg_w_val(gspca_dev, ET_RESET_ALL, 0x08); | 703 | reg_w_val(gspca_dev, ET_RESET_ALL, 0x08); |
645 | et_video(gspca_dev, 1); /* video on */ | 704 | et_video(gspca_dev, 1); /* video on */ |
646 | } | 705 | } |
@@ -658,52 +717,6 @@ static void sd_close(struct gspca_dev *gspca_dev) | |||
658 | { | 717 | { |
659 | } | 718 | } |
660 | 719 | ||
661 | static void setbrightness(struct gspca_dev *gspca_dev) | ||
662 | { | ||
663 | struct sd *sd = (struct sd *) gspca_dev; | ||
664 | int i; | ||
665 | __u8 brightness = sd->brightness; | ||
666 | |||
667 | for (i = 0; i < 4; i++) | ||
668 | reg_w_val(gspca_dev, ET_O_RED + i, brightness); | ||
669 | } | ||
670 | |||
671 | static void getbrightness(struct gspca_dev *gspca_dev) | ||
672 | { | ||
673 | struct sd *sd = (struct sd *) gspca_dev; | ||
674 | int i; | ||
675 | int brightness = 0; | ||
676 | |||
677 | for (i = 0; i < 4; i++) { | ||
678 | reg_r(gspca_dev, ET_O_RED + i, 1); | ||
679 | brightness += gspca_dev->usb_buf[0]; | ||
680 | } | ||
681 | sd->brightness = brightness >> 3; | ||
682 | } | ||
683 | |||
684 | static void setcontrast(struct gspca_dev *gspca_dev) | ||
685 | { | ||
686 | struct sd *sd = (struct sd *) gspca_dev; | ||
687 | __u8 RGBG[] = { 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }; | ||
688 | __u8 contrast = sd->contrast; | ||
689 | |||
690 | memset(RGBG, contrast, sizeof(RGBG) - 2); | ||
691 | reg_w(gspca_dev, ET_G_RED, RGBG, 6); | ||
692 | } | ||
693 | |||
694 | static void getcontrast(struct gspca_dev *gspca_dev) | ||
695 | { | ||
696 | struct sd *sd = (struct sd *) gspca_dev; | ||
697 | int i; | ||
698 | int contrast = 0; | ||
699 | |||
700 | for (i = 0; i < 4; i++) { | ||
701 | reg_r(gspca_dev, ET_G_RED + i, 1); | ||
702 | contrast += gspca_dev->usb_buf[0]; | ||
703 | } | ||
704 | sd->contrast = contrast >> 2; | ||
705 | } | ||
706 | |||
707 | static __u8 Et_getgainG(struct gspca_dev *gspca_dev) | 720 | static __u8 Et_getgainG(struct gspca_dev *gspca_dev) |
708 | { | 721 | { |
709 | struct sd *sd = (struct sd *) gspca_dev; | 722 | struct sd *sd = (struct sd *) gspca_dev; |
@@ -733,15 +746,22 @@ static void Et_setgainG(struct gspca_dev *gspca_dev, __u8 gain) | |||
733 | #define LIMIT(color) \ | 746 | #define LIMIT(color) \ |
734 | (unsigned char)((color > 0xff)?0xff:((color < 0)?0:color)) | 747 | (unsigned char)((color > 0xff)?0xff:((color < 0)?0:color)) |
735 | 748 | ||
736 | static void setautogain(struct gspca_dev *gspca_dev) | 749 | static void do_autogain(struct gspca_dev *gspca_dev) |
737 | { | 750 | { |
738 | __u8 luma = 0; | 751 | struct sd *sd = (struct sd *) gspca_dev; |
752 | __u8 luma; | ||
739 | __u8 luma_mean = 128; | 753 | __u8 luma_mean = 128; |
740 | __u8 luma_delta = 20; | 754 | __u8 luma_delta = 20; |
741 | __u8 spring = 4; | 755 | __u8 spring = 4; |
742 | int Gbright = 0; | 756 | int Gbright; |
743 | __u8 r, g, b; | 757 | __u8 r, g, b; |
744 | 758 | ||
759 | if (sd->ag_cnt < 0) | ||
760 | return; | ||
761 | if (--sd->ag_cnt >= 0) | ||
762 | return; | ||
763 | sd->ag_cnt = AG_CNT_START; | ||
764 | |||
745 | Gbright = Et_getgainG(gspca_dev); | 765 | Gbright = Et_getgainG(gspca_dev); |
746 | reg_r(gspca_dev, ET_LUMA_CENTER, 4); | 766 | reg_r(gspca_dev, ET_LUMA_CENTER, 4); |
747 | g = (gspca_dev->usb_buf[0] + gspca_dev->usb_buf[3]) >> 1; | 767 | 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, | |||
768 | __u8 *data, /* isoc packet */ | 788 | __u8 *data, /* isoc packet */ |
769 | int len) /* iso packet length */ | 789 | int len) /* iso packet length */ |
770 | { | 790 | { |
771 | struct sd *sd; | ||
772 | int seqframe; | 791 | int seqframe; |
773 | 792 | ||
774 | seqframe = data[0] & 0x3f; | 793 | seqframe = data[0] & 0x3f; |
@@ -783,13 +802,6 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
783 | frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, | 802 | frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, |
784 | data, 0); | 803 | data, 0); |
785 | gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); | 804 | gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); |
786 | sd = (struct sd *) gspca_dev; | ||
787 | if (sd->ag_cnt >= 0) { | ||
788 | if (--sd->ag_cnt < 0) { | ||
789 | sd->ag_cnt = AG_CNT_START; | ||
790 | setautogain(gspca_dev); | ||
791 | } | ||
792 | } | ||
793 | return; | 805 | return; |
794 | } | 806 | } |
795 | if (len) { | 807 | if (len) { |
@@ -862,10 +874,8 @@ static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val) | |||
862 | struct sd *sd = (struct sd *) gspca_dev; | 874 | struct sd *sd = (struct sd *) gspca_dev; |
863 | 875 | ||
864 | sd->autogain = val; | 876 | sd->autogain = val; |
865 | if (val) | 877 | if (gspca_dev->streaming) |
866 | sd->ag_cnt = AG_CNT_START; | 878 | setautogain(gspca_dev); |
867 | else | ||
868 | sd->ag_cnt = -1; | ||
869 | return 0; | 879 | return 0; |
870 | } | 880 | } |
871 | 881 | ||
@@ -889,6 +899,7 @@ static struct sd_desc sd_desc = { | |||
889 | .stop0 = sd_stop0, | 899 | .stop0 = sd_stop0, |
890 | .close = sd_close, | 900 | .close = sd_close, |
891 | .pkt_scan = sd_pkt_scan, | 901 | .pkt_scan = sd_pkt_scan, |
902 | .dq_callback = do_autogain, | ||
892 | }; | 903 | }; |
893 | 904 | ||
894 | /* -- module initialisation -- */ | 905 | /* -- module initialisation -- */ |