Commit 2576415846bcbad3c0a6885fc44f950837106364
Committed by
Mauro Carvalho Chehab
1 parent
b18787ed1c
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
[media] v4l2: move dv-timings related code to v4l2-dv-timings.c
v4l2-common.c contained a bunch of dv-timings related functions. Move that to the new v4l2-dv-timings.c which is a more appropriate place for them. There aren't many drivers that do HDTV, so it is a good idea to separate common code related to that into a module of its own. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Acked-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Showing 8 changed files with 420 additions and 371 deletions Side-by-side Diff
drivers/media/i2c/ad9389b.c
drivers/media/i2c/adv7604.c
drivers/media/i2c/ths8200.c
drivers/media/usb/hdpvr/hdpvr-video.c
drivers/media/v4l2-core/v4l2-common.c
... | ... | @@ -495,363 +495,6 @@ |
495 | 495 | } |
496 | 496 | EXPORT_SYMBOL_GPL(v4l_bound_align_image); |
497 | 497 | |
498 | -/** | |
499 | - * v4l_match_dv_timings - check if two timings match | |
500 | - * @t1 - compare this v4l2_dv_timings struct... | |
501 | - * @t2 - with this struct. | |
502 | - * @pclock_delta - the allowed pixelclock deviation. | |
503 | - * | |
504 | - * Compare t1 with t2 with a given margin of error for the pixelclock. | |
505 | - */ | |
506 | -bool v4l_match_dv_timings(const struct v4l2_dv_timings *t1, | |
507 | - const struct v4l2_dv_timings *t2, | |
508 | - unsigned pclock_delta) | |
509 | -{ | |
510 | - if (t1->type != t2->type || t1->type != V4L2_DV_BT_656_1120) | |
511 | - return false; | |
512 | - if (t1->bt.width == t2->bt.width && | |
513 | - t1->bt.height == t2->bt.height && | |
514 | - t1->bt.interlaced == t2->bt.interlaced && | |
515 | - t1->bt.polarities == t2->bt.polarities && | |
516 | - t1->bt.pixelclock >= t2->bt.pixelclock - pclock_delta && | |
517 | - t1->bt.pixelclock <= t2->bt.pixelclock + pclock_delta && | |
518 | - t1->bt.hfrontporch == t2->bt.hfrontporch && | |
519 | - t1->bt.vfrontporch == t2->bt.vfrontporch && | |
520 | - t1->bt.vsync == t2->bt.vsync && | |
521 | - t1->bt.vbackporch == t2->bt.vbackporch && | |
522 | - (!t1->bt.interlaced || | |
523 | - (t1->bt.il_vfrontporch == t2->bt.il_vfrontporch && | |
524 | - t1->bt.il_vsync == t2->bt.il_vsync && | |
525 | - t1->bt.il_vbackporch == t2->bt.il_vbackporch))) | |
526 | - return true; | |
527 | - return false; | |
528 | -} | |
529 | -EXPORT_SYMBOL_GPL(v4l_match_dv_timings); | |
530 | - | |
531 | -/* | |
532 | - * CVT defines | |
533 | - * Based on Coordinated Video Timings Standard | |
534 | - * version 1.1 September 10, 2003 | |
535 | - */ | |
536 | - | |
537 | -#define CVT_PXL_CLK_GRAN 250000 /* pixel clock granularity */ | |
538 | - | |
539 | -/* Normal blanking */ | |
540 | -#define CVT_MIN_V_BPORCH 7 /* lines */ | |
541 | -#define CVT_MIN_V_PORCH_RND 3 /* lines */ | |
542 | -#define CVT_MIN_VSYNC_BP 550 /* min time of vsync + back porch (us) */ | |
543 | - | |
544 | -/* Normal blanking for CVT uses GTF to calculate horizontal blanking */ | |
545 | -#define CVT_CELL_GRAN 8 /* character cell granularity */ | |
546 | -#define CVT_M 600 /* blanking formula gradient */ | |
547 | -#define CVT_C 40 /* blanking formula offset */ | |
548 | -#define CVT_K 128 /* blanking formula scaling factor */ | |
549 | -#define CVT_J 20 /* blanking formula scaling factor */ | |
550 | -#define CVT_C_PRIME (((CVT_C - CVT_J) * CVT_K / 256) + CVT_J) | |
551 | -#define CVT_M_PRIME (CVT_K * CVT_M / 256) | |
552 | - | |
553 | -/* Reduced Blanking */ | |
554 | -#define CVT_RB_MIN_V_BPORCH 7 /* lines */ | |
555 | -#define CVT_RB_V_FPORCH 3 /* lines */ | |
556 | -#define CVT_RB_MIN_V_BLANK 460 /* us */ | |
557 | -#define CVT_RB_H_SYNC 32 /* pixels */ | |
558 | -#define CVT_RB_H_BPORCH 80 /* pixels */ | |
559 | -#define CVT_RB_H_BLANK 160 /* pixels */ | |
560 | - | |
561 | -/** v4l2_detect_cvt - detect if the given timings follow the CVT standard | |
562 | - * @frame_height - the total height of the frame (including blanking) in lines. | |
563 | - * @hfreq - the horizontal frequency in Hz. | |
564 | - * @vsync - the height of the vertical sync in lines. | |
565 | - * @polarities - the horizontal and vertical polarities (same as struct | |
566 | - * v4l2_bt_timings polarities). | |
567 | - * @fmt - the resulting timings. | |
568 | - * | |
569 | - * This function will attempt to detect if the given values correspond to a | |
570 | - * valid CVT format. If so, then it will return true, and fmt will be filled | |
571 | - * in with the found CVT timings. | |
572 | - */ | |
573 | -bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync, | |
574 | - u32 polarities, struct v4l2_dv_timings *fmt) | |
575 | -{ | |
576 | - int v_fp, v_bp, h_fp, h_bp, hsync; | |
577 | - int frame_width, image_height, image_width; | |
578 | - bool reduced_blanking; | |
579 | - unsigned pix_clk; | |
580 | - | |
581 | - if (vsync < 4 || vsync > 7) | |
582 | - return false; | |
583 | - | |
584 | - if (polarities == V4L2_DV_VSYNC_POS_POL) | |
585 | - reduced_blanking = false; | |
586 | - else if (polarities == V4L2_DV_HSYNC_POS_POL) | |
587 | - reduced_blanking = true; | |
588 | - else | |
589 | - return false; | |
590 | - | |
591 | - /* Vertical */ | |
592 | - if (reduced_blanking) { | |
593 | - v_fp = CVT_RB_V_FPORCH; | |
594 | - v_bp = (CVT_RB_MIN_V_BLANK * hfreq + 999999) / 1000000; | |
595 | - v_bp -= vsync + v_fp; | |
596 | - | |
597 | - if (v_bp < CVT_RB_MIN_V_BPORCH) | |
598 | - v_bp = CVT_RB_MIN_V_BPORCH; | |
599 | - } else { | |
600 | - v_fp = CVT_MIN_V_PORCH_RND; | |
601 | - v_bp = (CVT_MIN_VSYNC_BP * hfreq + 999999) / 1000000 - vsync; | |
602 | - | |
603 | - if (v_bp < CVT_MIN_V_BPORCH) | |
604 | - v_bp = CVT_MIN_V_BPORCH; | |
605 | - } | |
606 | - image_height = (frame_height - v_fp - vsync - v_bp + 1) & ~0x1; | |
607 | - | |
608 | - /* Aspect ratio based on vsync */ | |
609 | - switch (vsync) { | |
610 | - case 4: | |
611 | - image_width = (image_height * 4) / 3; | |
612 | - break; | |
613 | - case 5: | |
614 | - image_width = (image_height * 16) / 9; | |
615 | - break; | |
616 | - case 6: | |
617 | - image_width = (image_height * 16) / 10; | |
618 | - break; | |
619 | - case 7: | |
620 | - /* special case */ | |
621 | - if (image_height == 1024) | |
622 | - image_width = (image_height * 5) / 4; | |
623 | - else if (image_height == 768) | |
624 | - image_width = (image_height * 15) / 9; | |
625 | - else | |
626 | - return false; | |
627 | - break; | |
628 | - default: | |
629 | - return false; | |
630 | - } | |
631 | - | |
632 | - image_width = image_width & ~7; | |
633 | - | |
634 | - /* Horizontal */ | |
635 | - if (reduced_blanking) { | |
636 | - pix_clk = (image_width + CVT_RB_H_BLANK) * hfreq; | |
637 | - pix_clk = (pix_clk / CVT_PXL_CLK_GRAN) * CVT_PXL_CLK_GRAN; | |
638 | - | |
639 | - h_bp = CVT_RB_H_BPORCH; | |
640 | - hsync = CVT_RB_H_SYNC; | |
641 | - h_fp = CVT_RB_H_BLANK - h_bp - hsync; | |
642 | - | |
643 | - frame_width = image_width + CVT_RB_H_BLANK; | |
644 | - } else { | |
645 | - int h_blank; | |
646 | - unsigned ideal_duty_cycle = CVT_C_PRIME - (CVT_M_PRIME * 1000) / hfreq; | |
647 | - | |
648 | - h_blank = (image_width * ideal_duty_cycle + (100 - ideal_duty_cycle) / 2) / | |
649 | - (100 - ideal_duty_cycle); | |
650 | - h_blank = h_blank - h_blank % (2 * CVT_CELL_GRAN); | |
651 | - | |
652 | - if (h_blank * 100 / image_width < 20) { | |
653 | - h_blank = image_width / 5; | |
654 | - h_blank = (h_blank + 0x7) & ~0x7; | |
655 | - } | |
656 | - | |
657 | - pix_clk = (image_width + h_blank) * hfreq; | |
658 | - pix_clk = (pix_clk / CVT_PXL_CLK_GRAN) * CVT_PXL_CLK_GRAN; | |
659 | - | |
660 | - h_bp = h_blank / 2; | |
661 | - frame_width = image_width + h_blank; | |
662 | - | |
663 | - hsync = (frame_width * 8 + 50) / 100; | |
664 | - hsync = hsync - hsync % CVT_CELL_GRAN; | |
665 | - h_fp = h_blank - hsync - h_bp; | |
666 | - } | |
667 | - | |
668 | - fmt->bt.polarities = polarities; | |
669 | - fmt->bt.width = image_width; | |
670 | - fmt->bt.height = image_height; | |
671 | - fmt->bt.hfrontporch = h_fp; | |
672 | - fmt->bt.vfrontporch = v_fp; | |
673 | - fmt->bt.hsync = hsync; | |
674 | - fmt->bt.vsync = vsync; | |
675 | - fmt->bt.hbackporch = frame_width - image_width - h_fp - hsync; | |
676 | - fmt->bt.vbackporch = frame_height - image_height - v_fp - vsync; | |
677 | - fmt->bt.pixelclock = pix_clk; | |
678 | - fmt->bt.standards = V4L2_DV_BT_STD_CVT; | |
679 | - if (reduced_blanking) | |
680 | - fmt->bt.flags |= V4L2_DV_FL_REDUCED_BLANKING; | |
681 | - return true; | |
682 | -} | |
683 | -EXPORT_SYMBOL_GPL(v4l2_detect_cvt); | |
684 | - | |
685 | -/* | |
686 | - * GTF defines | |
687 | - * Based on Generalized Timing Formula Standard | |
688 | - * Version 1.1 September 2, 1999 | |
689 | - */ | |
690 | - | |
691 | -#define GTF_PXL_CLK_GRAN 250000 /* pixel clock granularity */ | |
692 | - | |
693 | -#define GTF_MIN_VSYNC_BP 550 /* min time of vsync + back porch (us) */ | |
694 | -#define GTF_V_FP 1 /* vertical front porch (lines) */ | |
695 | -#define GTF_CELL_GRAN 8 /* character cell granularity */ | |
696 | - | |
697 | -/* Default */ | |
698 | -#define GTF_D_M 600 /* blanking formula gradient */ | |
699 | -#define GTF_D_C 40 /* blanking formula offset */ | |
700 | -#define GTF_D_K 128 /* blanking formula scaling factor */ | |
701 | -#define GTF_D_J 20 /* blanking formula scaling factor */ | |
702 | -#define GTF_D_C_PRIME ((((GTF_D_C - GTF_D_J) * GTF_D_K) / 256) + GTF_D_J) | |
703 | -#define GTF_D_M_PRIME ((GTF_D_K * GTF_D_M) / 256) | |
704 | - | |
705 | -/* Secondary */ | |
706 | -#define GTF_S_M 3600 /* blanking formula gradient */ | |
707 | -#define GTF_S_C 40 /* blanking formula offset */ | |
708 | -#define GTF_S_K 128 /* blanking formula scaling factor */ | |
709 | -#define GTF_S_J 35 /* blanking formula scaling factor */ | |
710 | -#define GTF_S_C_PRIME ((((GTF_S_C - GTF_S_J) * GTF_S_K) / 256) + GTF_S_J) | |
711 | -#define GTF_S_M_PRIME ((GTF_S_K * GTF_S_M) / 256) | |
712 | - | |
713 | -/** v4l2_detect_gtf - detect if the given timings follow the GTF standard | |
714 | - * @frame_height - the total height of the frame (including blanking) in lines. | |
715 | - * @hfreq - the horizontal frequency in Hz. | |
716 | - * @vsync - the height of the vertical sync in lines. | |
717 | - * @polarities - the horizontal and vertical polarities (same as struct | |
718 | - * v4l2_bt_timings polarities). | |
719 | - * @aspect - preferred aspect ratio. GTF has no method of determining the | |
720 | - * aspect ratio in order to derive the image width from the | |
721 | - * image height, so it has to be passed explicitly. Usually | |
722 | - * the native screen aspect ratio is used for this. If it | |
723 | - * is not filled in correctly, then 16:9 will be assumed. | |
724 | - * @fmt - the resulting timings. | |
725 | - * | |
726 | - * This function will attempt to detect if the given values correspond to a | |
727 | - * valid GTF format. If so, then it will return true, and fmt will be filled | |
728 | - * in with the found GTF timings. | |
729 | - */ | |
730 | -bool v4l2_detect_gtf(unsigned frame_height, | |
731 | - unsigned hfreq, | |
732 | - unsigned vsync, | |
733 | - u32 polarities, | |
734 | - struct v4l2_fract aspect, | |
735 | - struct v4l2_dv_timings *fmt) | |
736 | -{ | |
737 | - int pix_clk; | |
738 | - int v_fp, v_bp, h_fp, hsync; | |
739 | - int frame_width, image_height, image_width; | |
740 | - bool default_gtf; | |
741 | - int h_blank; | |
742 | - | |
743 | - if (vsync != 3) | |
744 | - return false; | |
745 | - | |
746 | - if (polarities == V4L2_DV_VSYNC_POS_POL) | |
747 | - default_gtf = true; | |
748 | - else if (polarities == V4L2_DV_HSYNC_POS_POL) | |
749 | - default_gtf = false; | |
750 | - else | |
751 | - return false; | |
752 | - | |
753 | - /* Vertical */ | |
754 | - v_fp = GTF_V_FP; | |
755 | - v_bp = (GTF_MIN_VSYNC_BP * hfreq + 999999) / 1000000 - vsync; | |
756 | - image_height = (frame_height - v_fp - vsync - v_bp + 1) & ~0x1; | |
757 | - | |
758 | - if (aspect.numerator == 0 || aspect.denominator == 0) { | |
759 | - aspect.numerator = 16; | |
760 | - aspect.denominator = 9; | |
761 | - } | |
762 | - image_width = ((image_height * aspect.numerator) / aspect.denominator); | |
763 | - | |
764 | - /* Horizontal */ | |
765 | - if (default_gtf) | |
766 | - h_blank = ((image_width * GTF_D_C_PRIME * hfreq) - | |
767 | - (image_width * GTF_D_M_PRIME * 1000) + | |
768 | - (hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000) / 2) / | |
769 | - (hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000); | |
770 | - else | |
771 | - h_blank = ((image_width * GTF_S_C_PRIME * hfreq) - | |
772 | - (image_width * GTF_S_M_PRIME * 1000) + | |
773 | - (hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000) / 2) / | |
774 | - (hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000); | |
775 | - | |
776 | - h_blank = h_blank - h_blank % (2 * GTF_CELL_GRAN); | |
777 | - frame_width = image_width + h_blank; | |
778 | - | |
779 | - pix_clk = (image_width + h_blank) * hfreq; | |
780 | - pix_clk = pix_clk / GTF_PXL_CLK_GRAN * GTF_PXL_CLK_GRAN; | |
781 | - | |
782 | - hsync = (frame_width * 8 + 50) / 100; | |
783 | - hsync = hsync - hsync % GTF_CELL_GRAN; | |
784 | - | |
785 | - h_fp = h_blank / 2 - hsync; | |
786 | - | |
787 | - fmt->bt.polarities = polarities; | |
788 | - fmt->bt.width = image_width; | |
789 | - fmt->bt.height = image_height; | |
790 | - fmt->bt.hfrontporch = h_fp; | |
791 | - fmt->bt.vfrontporch = v_fp; | |
792 | - fmt->bt.hsync = hsync; | |
793 | - fmt->bt.vsync = vsync; | |
794 | - fmt->bt.hbackporch = frame_width - image_width - h_fp - hsync; | |
795 | - fmt->bt.vbackporch = frame_height - image_height - v_fp - vsync; | |
796 | - fmt->bt.pixelclock = pix_clk; | |
797 | - fmt->bt.standards = V4L2_DV_BT_STD_GTF; | |
798 | - if (!default_gtf) | |
799 | - fmt->bt.flags |= V4L2_DV_FL_REDUCED_BLANKING; | |
800 | - return true; | |
801 | -} | |
802 | -EXPORT_SYMBOL_GPL(v4l2_detect_gtf); | |
803 | - | |
804 | -/** v4l2_calc_aspect_ratio - calculate the aspect ratio based on bytes | |
805 | - * 0x15 and 0x16 from the EDID. | |
806 | - * @hor_landscape - byte 0x15 from the EDID. | |
807 | - * @vert_portrait - byte 0x16 from the EDID. | |
808 | - * | |
809 | - * Determines the aspect ratio from the EDID. | |
810 | - * See VESA Enhanced EDID standard, release A, rev 2, section 3.6.2: | |
811 | - * "Horizontal and Vertical Screen Size or Aspect Ratio" | |
812 | - */ | |
813 | -struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait) | |
814 | -{ | |
815 | - struct v4l2_fract aspect = { 16, 9 }; | |
816 | - u32 tmp; | |
817 | - u8 ratio; | |
818 | - | |
819 | - /* Nothing filled in, fallback to 16:9 */ | |
820 | - if (!hor_landscape && !vert_portrait) | |
821 | - return aspect; | |
822 | - /* Both filled in, so they are interpreted as the screen size in cm */ | |
823 | - if (hor_landscape && vert_portrait) { | |
824 | - aspect.numerator = hor_landscape; | |
825 | - aspect.denominator = vert_portrait; | |
826 | - return aspect; | |
827 | - } | |
828 | - /* Only one is filled in, so interpret them as a ratio: | |
829 | - (val + 99) / 100 */ | |
830 | - ratio = hor_landscape | vert_portrait; | |
831 | - /* Change some rounded values into the exact aspect ratio */ | |
832 | - if (ratio == 79) { | |
833 | - aspect.numerator = 16; | |
834 | - aspect.denominator = 9; | |
835 | - } else if (ratio == 34) { | |
836 | - aspect.numerator = 4; | |
837 | - aspect.numerator = 3; | |
838 | - } else if (ratio == 68) { | |
839 | - aspect.numerator = 15; | |
840 | - aspect.numerator = 9; | |
841 | - } else { | |
842 | - aspect.numerator = hor_landscape + 99; | |
843 | - aspect.denominator = 100; | |
844 | - } | |
845 | - if (hor_landscape) | |
846 | - return aspect; | |
847 | - /* The aspect ratio is for portrait, so swap numerator and denominator */ | |
848 | - tmp = aspect.denominator; | |
849 | - aspect.denominator = aspect.numerator; | |
850 | - aspect.numerator = tmp; | |
851 | - return aspect; | |
852 | -} | |
853 | -EXPORT_SYMBOL_GPL(v4l2_calc_aspect_ratio); | |
854 | - | |
855 | 498 | const struct v4l2_frmsize_discrete *v4l2_find_nearest_format( |
856 | 499 | const struct v4l2_discrete_probe *probe, |
857 | 500 | s32 width, s32 height) |
drivers/media/v4l2-core/v4l2-dv-timings.c
... | ... | @@ -24,7 +24,6 @@ |
24 | 24 | #include <linux/errno.h> |
25 | 25 | #include <linux/videodev2.h> |
26 | 26 | #include <linux/v4l2-dv-timings.h> |
27 | -#include <media/v4l2-common.h> | |
28 | 27 | #include <media/v4l2-dv-timings.h> |
29 | 28 | |
30 | 29 | static const struct v4l2_dv_timings timings[] = { |
... | ... | @@ -190,4 +189,361 @@ |
190 | 189 | return false; |
191 | 190 | } |
192 | 191 | EXPORT_SYMBOL_GPL(v4l2_find_dv_timings_cap); |
192 | + | |
193 | +/** | |
194 | + * v4l_match_dv_timings - check if two timings match | |
195 | + * @t1 - compare this v4l2_dv_timings struct... | |
196 | + * @t2 - with this struct. | |
197 | + * @pclock_delta - the allowed pixelclock deviation. | |
198 | + * | |
199 | + * Compare t1 with t2 with a given margin of error for the pixelclock. | |
200 | + */ | |
201 | +bool v4l_match_dv_timings(const struct v4l2_dv_timings *t1, | |
202 | + const struct v4l2_dv_timings *t2, | |
203 | + unsigned pclock_delta) | |
204 | +{ | |
205 | + if (t1->type != t2->type || t1->type != V4L2_DV_BT_656_1120) | |
206 | + return false; | |
207 | + if (t1->bt.width == t2->bt.width && | |
208 | + t1->bt.height == t2->bt.height && | |
209 | + t1->bt.interlaced == t2->bt.interlaced && | |
210 | + t1->bt.polarities == t2->bt.polarities && | |
211 | + t1->bt.pixelclock >= t2->bt.pixelclock - pclock_delta && | |
212 | + t1->bt.pixelclock <= t2->bt.pixelclock + pclock_delta && | |
213 | + t1->bt.hfrontporch == t2->bt.hfrontporch && | |
214 | + t1->bt.vfrontporch == t2->bt.vfrontporch && | |
215 | + t1->bt.vsync == t2->bt.vsync && | |
216 | + t1->bt.vbackporch == t2->bt.vbackporch && | |
217 | + (!t1->bt.interlaced || | |
218 | + (t1->bt.il_vfrontporch == t2->bt.il_vfrontporch && | |
219 | + t1->bt.il_vsync == t2->bt.il_vsync && | |
220 | + t1->bt.il_vbackporch == t2->bt.il_vbackporch))) | |
221 | + return true; | |
222 | + return false; | |
223 | +} | |
224 | +EXPORT_SYMBOL_GPL(v4l_match_dv_timings); | |
225 | + | |
226 | +/* | |
227 | + * CVT defines | |
228 | + * Based on Coordinated Video Timings Standard | |
229 | + * version 1.1 September 10, 2003 | |
230 | + */ | |
231 | + | |
232 | +#define CVT_PXL_CLK_GRAN 250000 /* pixel clock granularity */ | |
233 | + | |
234 | +/* Normal blanking */ | |
235 | +#define CVT_MIN_V_BPORCH 7 /* lines */ | |
236 | +#define CVT_MIN_V_PORCH_RND 3 /* lines */ | |
237 | +#define CVT_MIN_VSYNC_BP 550 /* min time of vsync + back porch (us) */ | |
238 | + | |
239 | +/* Normal blanking for CVT uses GTF to calculate horizontal blanking */ | |
240 | +#define CVT_CELL_GRAN 8 /* character cell granularity */ | |
241 | +#define CVT_M 600 /* blanking formula gradient */ | |
242 | +#define CVT_C 40 /* blanking formula offset */ | |
243 | +#define CVT_K 128 /* blanking formula scaling factor */ | |
244 | +#define CVT_J 20 /* blanking formula scaling factor */ | |
245 | +#define CVT_C_PRIME (((CVT_C - CVT_J) * CVT_K / 256) + CVT_J) | |
246 | +#define CVT_M_PRIME (CVT_K * CVT_M / 256) | |
247 | + | |
248 | +/* Reduced Blanking */ | |
249 | +#define CVT_RB_MIN_V_BPORCH 7 /* lines */ | |
250 | +#define CVT_RB_V_FPORCH 3 /* lines */ | |
251 | +#define CVT_RB_MIN_V_BLANK 460 /* us */ | |
252 | +#define CVT_RB_H_SYNC 32 /* pixels */ | |
253 | +#define CVT_RB_H_BPORCH 80 /* pixels */ | |
254 | +#define CVT_RB_H_BLANK 160 /* pixels */ | |
255 | + | |
256 | +/** v4l2_detect_cvt - detect if the given timings follow the CVT standard | |
257 | + * @frame_height - the total height of the frame (including blanking) in lines. | |
258 | + * @hfreq - the horizontal frequency in Hz. | |
259 | + * @vsync - the height of the vertical sync in lines. | |
260 | + * @polarities - the horizontal and vertical polarities (same as struct | |
261 | + * v4l2_bt_timings polarities). | |
262 | + * @fmt - the resulting timings. | |
263 | + * | |
264 | + * This function will attempt to detect if the given values correspond to a | |
265 | + * valid CVT format. If so, then it will return true, and fmt will be filled | |
266 | + * in with the found CVT timings. | |
267 | + */ | |
268 | +bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync, | |
269 | + u32 polarities, struct v4l2_dv_timings *fmt) | |
270 | +{ | |
271 | + int v_fp, v_bp, h_fp, h_bp, hsync; | |
272 | + int frame_width, image_height, image_width; | |
273 | + bool reduced_blanking; | |
274 | + unsigned pix_clk; | |
275 | + | |
276 | + if (vsync < 4 || vsync > 7) | |
277 | + return false; | |
278 | + | |
279 | + if (polarities == V4L2_DV_VSYNC_POS_POL) | |
280 | + reduced_blanking = false; | |
281 | + else if (polarities == V4L2_DV_HSYNC_POS_POL) | |
282 | + reduced_blanking = true; | |
283 | + else | |
284 | + return false; | |
285 | + | |
286 | + /* Vertical */ | |
287 | + if (reduced_blanking) { | |
288 | + v_fp = CVT_RB_V_FPORCH; | |
289 | + v_bp = (CVT_RB_MIN_V_BLANK * hfreq + 999999) / 1000000; | |
290 | + v_bp -= vsync + v_fp; | |
291 | + | |
292 | + if (v_bp < CVT_RB_MIN_V_BPORCH) | |
293 | + v_bp = CVT_RB_MIN_V_BPORCH; | |
294 | + } else { | |
295 | + v_fp = CVT_MIN_V_PORCH_RND; | |
296 | + v_bp = (CVT_MIN_VSYNC_BP * hfreq + 999999) / 1000000 - vsync; | |
297 | + | |
298 | + if (v_bp < CVT_MIN_V_BPORCH) | |
299 | + v_bp = CVT_MIN_V_BPORCH; | |
300 | + } | |
301 | + image_height = (frame_height - v_fp - vsync - v_bp + 1) & ~0x1; | |
302 | + | |
303 | + /* Aspect ratio based on vsync */ | |
304 | + switch (vsync) { | |
305 | + case 4: | |
306 | + image_width = (image_height * 4) / 3; | |
307 | + break; | |
308 | + case 5: | |
309 | + image_width = (image_height * 16) / 9; | |
310 | + break; | |
311 | + case 6: | |
312 | + image_width = (image_height * 16) / 10; | |
313 | + break; | |
314 | + case 7: | |
315 | + /* special case */ | |
316 | + if (image_height == 1024) | |
317 | + image_width = (image_height * 5) / 4; | |
318 | + else if (image_height == 768) | |
319 | + image_width = (image_height * 15) / 9; | |
320 | + else | |
321 | + return false; | |
322 | + break; | |
323 | + default: | |
324 | + return false; | |
325 | + } | |
326 | + | |
327 | + image_width = image_width & ~7; | |
328 | + | |
329 | + /* Horizontal */ | |
330 | + if (reduced_blanking) { | |
331 | + pix_clk = (image_width + CVT_RB_H_BLANK) * hfreq; | |
332 | + pix_clk = (pix_clk / CVT_PXL_CLK_GRAN) * CVT_PXL_CLK_GRAN; | |
333 | + | |
334 | + h_bp = CVT_RB_H_BPORCH; | |
335 | + hsync = CVT_RB_H_SYNC; | |
336 | + h_fp = CVT_RB_H_BLANK - h_bp - hsync; | |
337 | + | |
338 | + frame_width = image_width + CVT_RB_H_BLANK; | |
339 | + } else { | |
340 | + int h_blank; | |
341 | + unsigned ideal_duty_cycle = CVT_C_PRIME - (CVT_M_PRIME * 1000) / hfreq; | |
342 | + | |
343 | + h_blank = (image_width * ideal_duty_cycle + (100 - ideal_duty_cycle) / 2) / | |
344 | + (100 - ideal_duty_cycle); | |
345 | + h_blank = h_blank - h_blank % (2 * CVT_CELL_GRAN); | |
346 | + | |
347 | + if (h_blank * 100 / image_width < 20) { | |
348 | + h_blank = image_width / 5; | |
349 | + h_blank = (h_blank + 0x7) & ~0x7; | |
350 | + } | |
351 | + | |
352 | + pix_clk = (image_width + h_blank) * hfreq; | |
353 | + pix_clk = (pix_clk / CVT_PXL_CLK_GRAN) * CVT_PXL_CLK_GRAN; | |
354 | + | |
355 | + h_bp = h_blank / 2; | |
356 | + frame_width = image_width + h_blank; | |
357 | + | |
358 | + hsync = (frame_width * 8 + 50) / 100; | |
359 | + hsync = hsync - hsync % CVT_CELL_GRAN; | |
360 | + h_fp = h_blank - hsync - h_bp; | |
361 | + } | |
362 | + | |
363 | + fmt->bt.polarities = polarities; | |
364 | + fmt->bt.width = image_width; | |
365 | + fmt->bt.height = image_height; | |
366 | + fmt->bt.hfrontporch = h_fp; | |
367 | + fmt->bt.vfrontporch = v_fp; | |
368 | + fmt->bt.hsync = hsync; | |
369 | + fmt->bt.vsync = vsync; | |
370 | + fmt->bt.hbackporch = frame_width - image_width - h_fp - hsync; | |
371 | + fmt->bt.vbackporch = frame_height - image_height - v_fp - vsync; | |
372 | + fmt->bt.pixelclock = pix_clk; | |
373 | + fmt->bt.standards = V4L2_DV_BT_STD_CVT; | |
374 | + if (reduced_blanking) | |
375 | + fmt->bt.flags |= V4L2_DV_FL_REDUCED_BLANKING; | |
376 | + return true; | |
377 | +} | |
378 | +EXPORT_SYMBOL_GPL(v4l2_detect_cvt); | |
379 | + | |
380 | +/* | |
381 | + * GTF defines | |
382 | + * Based on Generalized Timing Formula Standard | |
383 | + * Version 1.1 September 2, 1999 | |
384 | + */ | |
385 | + | |
386 | +#define GTF_PXL_CLK_GRAN 250000 /* pixel clock granularity */ | |
387 | + | |
388 | +#define GTF_MIN_VSYNC_BP 550 /* min time of vsync + back porch (us) */ | |
389 | +#define GTF_V_FP 1 /* vertical front porch (lines) */ | |
390 | +#define GTF_CELL_GRAN 8 /* character cell granularity */ | |
391 | + | |
392 | +/* Default */ | |
393 | +#define GTF_D_M 600 /* blanking formula gradient */ | |
394 | +#define GTF_D_C 40 /* blanking formula offset */ | |
395 | +#define GTF_D_K 128 /* blanking formula scaling factor */ | |
396 | +#define GTF_D_J 20 /* blanking formula scaling factor */ | |
397 | +#define GTF_D_C_PRIME ((((GTF_D_C - GTF_D_J) * GTF_D_K) / 256) + GTF_D_J) | |
398 | +#define GTF_D_M_PRIME ((GTF_D_K * GTF_D_M) / 256) | |
399 | + | |
400 | +/* Secondary */ | |
401 | +#define GTF_S_M 3600 /* blanking formula gradient */ | |
402 | +#define GTF_S_C 40 /* blanking formula offset */ | |
403 | +#define GTF_S_K 128 /* blanking formula scaling factor */ | |
404 | +#define GTF_S_J 35 /* blanking formula scaling factor */ | |
405 | +#define GTF_S_C_PRIME ((((GTF_S_C - GTF_S_J) * GTF_S_K) / 256) + GTF_S_J) | |
406 | +#define GTF_S_M_PRIME ((GTF_S_K * GTF_S_M) / 256) | |
407 | + | |
408 | +/** v4l2_detect_gtf - detect if the given timings follow the GTF standard | |
409 | + * @frame_height - the total height of the frame (including blanking) in lines. | |
410 | + * @hfreq - the horizontal frequency in Hz. | |
411 | + * @vsync - the height of the vertical sync in lines. | |
412 | + * @polarities - the horizontal and vertical polarities (same as struct | |
413 | + * v4l2_bt_timings polarities). | |
414 | + * @aspect - preferred aspect ratio. GTF has no method of determining the | |
415 | + * aspect ratio in order to derive the image width from the | |
416 | + * image height, so it has to be passed explicitly. Usually | |
417 | + * the native screen aspect ratio is used for this. If it | |
418 | + * is not filled in correctly, then 16:9 will be assumed. | |
419 | + * @fmt - the resulting timings. | |
420 | + * | |
421 | + * This function will attempt to detect if the given values correspond to a | |
422 | + * valid GTF format. If so, then it will return true, and fmt will be filled | |
423 | + * in with the found GTF timings. | |
424 | + */ | |
425 | +bool v4l2_detect_gtf(unsigned frame_height, | |
426 | + unsigned hfreq, | |
427 | + unsigned vsync, | |
428 | + u32 polarities, | |
429 | + struct v4l2_fract aspect, | |
430 | + struct v4l2_dv_timings *fmt) | |
431 | +{ | |
432 | + int pix_clk; | |
433 | + int v_fp, v_bp, h_fp, hsync; | |
434 | + int frame_width, image_height, image_width; | |
435 | + bool default_gtf; | |
436 | + int h_blank; | |
437 | + | |
438 | + if (vsync != 3) | |
439 | + return false; | |
440 | + | |
441 | + if (polarities == V4L2_DV_VSYNC_POS_POL) | |
442 | + default_gtf = true; | |
443 | + else if (polarities == V4L2_DV_HSYNC_POS_POL) | |
444 | + default_gtf = false; | |
445 | + else | |
446 | + return false; | |
447 | + | |
448 | + /* Vertical */ | |
449 | + v_fp = GTF_V_FP; | |
450 | + v_bp = (GTF_MIN_VSYNC_BP * hfreq + 999999) / 1000000 - vsync; | |
451 | + image_height = (frame_height - v_fp - vsync - v_bp + 1) & ~0x1; | |
452 | + | |
453 | + if (aspect.numerator == 0 || aspect.denominator == 0) { | |
454 | + aspect.numerator = 16; | |
455 | + aspect.denominator = 9; | |
456 | + } | |
457 | + image_width = ((image_height * aspect.numerator) / aspect.denominator); | |
458 | + | |
459 | + /* Horizontal */ | |
460 | + if (default_gtf) | |
461 | + h_blank = ((image_width * GTF_D_C_PRIME * hfreq) - | |
462 | + (image_width * GTF_D_M_PRIME * 1000) + | |
463 | + (hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000) / 2) / | |
464 | + (hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000); | |
465 | + else | |
466 | + h_blank = ((image_width * GTF_S_C_PRIME * hfreq) - | |
467 | + (image_width * GTF_S_M_PRIME * 1000) + | |
468 | + (hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000) / 2) / | |
469 | + (hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000); | |
470 | + | |
471 | + h_blank = h_blank - h_blank % (2 * GTF_CELL_GRAN); | |
472 | + frame_width = image_width + h_blank; | |
473 | + | |
474 | + pix_clk = (image_width + h_blank) * hfreq; | |
475 | + pix_clk = pix_clk / GTF_PXL_CLK_GRAN * GTF_PXL_CLK_GRAN; | |
476 | + | |
477 | + hsync = (frame_width * 8 + 50) / 100; | |
478 | + hsync = hsync - hsync % GTF_CELL_GRAN; | |
479 | + | |
480 | + h_fp = h_blank / 2 - hsync; | |
481 | + | |
482 | + fmt->bt.polarities = polarities; | |
483 | + fmt->bt.width = image_width; | |
484 | + fmt->bt.height = image_height; | |
485 | + fmt->bt.hfrontporch = h_fp; | |
486 | + fmt->bt.vfrontporch = v_fp; | |
487 | + fmt->bt.hsync = hsync; | |
488 | + fmt->bt.vsync = vsync; | |
489 | + fmt->bt.hbackporch = frame_width - image_width - h_fp - hsync; | |
490 | + fmt->bt.vbackporch = frame_height - image_height - v_fp - vsync; | |
491 | + fmt->bt.pixelclock = pix_clk; | |
492 | + fmt->bt.standards = V4L2_DV_BT_STD_GTF; | |
493 | + if (!default_gtf) | |
494 | + fmt->bt.flags |= V4L2_DV_FL_REDUCED_BLANKING; | |
495 | + return true; | |
496 | +} | |
497 | +EXPORT_SYMBOL_GPL(v4l2_detect_gtf); | |
498 | + | |
499 | +/** v4l2_calc_aspect_ratio - calculate the aspect ratio based on bytes | |
500 | + * 0x15 and 0x16 from the EDID. | |
501 | + * @hor_landscape - byte 0x15 from the EDID. | |
502 | + * @vert_portrait - byte 0x16 from the EDID. | |
503 | + * | |
504 | + * Determines the aspect ratio from the EDID. | |
505 | + * See VESA Enhanced EDID standard, release A, rev 2, section 3.6.2: | |
506 | + * "Horizontal and Vertical Screen Size or Aspect Ratio" | |
507 | + */ | |
508 | +struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait) | |
509 | +{ | |
510 | + struct v4l2_fract aspect = { 16, 9 }; | |
511 | + u32 tmp; | |
512 | + u8 ratio; | |
513 | + | |
514 | + /* Nothing filled in, fallback to 16:9 */ | |
515 | + if (!hor_landscape && !vert_portrait) | |
516 | + return aspect; | |
517 | + /* Both filled in, so they are interpreted as the screen size in cm */ | |
518 | + if (hor_landscape && vert_portrait) { | |
519 | + aspect.numerator = hor_landscape; | |
520 | + aspect.denominator = vert_portrait; | |
521 | + return aspect; | |
522 | + } | |
523 | + /* Only one is filled in, so interpret them as a ratio: | |
524 | + (val + 99) / 100 */ | |
525 | + ratio = hor_landscape | vert_portrait; | |
526 | + /* Change some rounded values into the exact aspect ratio */ | |
527 | + if (ratio == 79) { | |
528 | + aspect.numerator = 16; | |
529 | + aspect.denominator = 9; | |
530 | + } else if (ratio == 34) { | |
531 | + aspect.numerator = 4; | |
532 | + aspect.numerator = 3; | |
533 | + } else if (ratio == 68) { | |
534 | + aspect.numerator = 15; | |
535 | + aspect.numerator = 9; | |
536 | + } else { | |
537 | + aspect.numerator = hor_landscape + 99; | |
538 | + aspect.denominator = 100; | |
539 | + } | |
540 | + if (hor_landscape) | |
541 | + return aspect; | |
542 | + /* The aspect ratio is for portrait, so swap numerator and denominator */ | |
543 | + tmp = aspect.denominator; | |
544 | + aspect.denominator = aspect.numerator; | |
545 | + aspect.numerator = tmp; | |
546 | + return aspect; | |
547 | +} | |
548 | +EXPORT_SYMBOL_GPL(v4l2_calc_aspect_ratio); |
include/media/v4l2-common.h
... | ... | @@ -201,19 +201,6 @@ |
201 | 201 | const struct v4l2_discrete_probe *probe, |
202 | 202 | s32 width, s32 height); |
203 | 203 | |
204 | -bool v4l_match_dv_timings(const struct v4l2_dv_timings *t1, | |
205 | - const struct v4l2_dv_timings *t2, | |
206 | - unsigned pclock_delta); | |
207 | - | |
208 | -bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync, | |
209 | - u32 polarities, struct v4l2_dv_timings *fmt); | |
210 | - | |
211 | -bool v4l2_detect_gtf(unsigned frame_height, unsigned hfreq, unsigned vsync, | |
212 | - u32 polarities, struct v4l2_fract aspect, | |
213 | - struct v4l2_dv_timings *fmt); | |
214 | - | |
215 | -struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait); | |
216 | - | |
217 | 204 | void v4l2_get_timestamp(struct timeval *tv); |
218 | 205 | |
219 | 206 | #endif /* V4L2_COMMON_H_ */ |
include/media/v4l2-dv-timings.h
... | ... | @@ -64,5 +64,64 @@ |
64 | 64 | const struct v4l2_dv_timings_cap *cap, |
65 | 65 | unsigned pclock_delta); |
66 | 66 | |
67 | +/** v4l_match_dv_timings() - do two timings match? | |
68 | + * @measured: the measured timings data. | |
69 | + * @standard: the timings according to the standard. | |
70 | + * @pclock_delta: maximum delta in Hz between standard->pixelclock and | |
71 | + * the measured timings. | |
72 | + * | |
73 | + * Returns true if the two timings match, returns false otherwise. | |
74 | + */ | |
75 | +bool v4l_match_dv_timings(const struct v4l2_dv_timings *measured, | |
76 | + const struct v4l2_dv_timings *standard, | |
77 | + unsigned pclock_delta); | |
78 | + | |
79 | +/** v4l2_detect_cvt - detect if the given timings follow the CVT standard | |
80 | + * @frame_height - the total height of the frame (including blanking) in lines. | |
81 | + * @hfreq - the horizontal frequency in Hz. | |
82 | + * @vsync - the height of the vertical sync in lines. | |
83 | + * @polarities - the horizontal and vertical polarities (same as struct | |
84 | + * v4l2_bt_timings polarities). | |
85 | + * @fmt - the resulting timings. | |
86 | + * | |
87 | + * This function will attempt to detect if the given values correspond to a | |
88 | + * valid CVT format. If so, then it will return true, and fmt will be filled | |
89 | + * in with the found CVT timings. | |
90 | + */ | |
91 | +bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync, | |
92 | + u32 polarities, struct v4l2_dv_timings *fmt); | |
93 | + | |
94 | +/** v4l2_detect_gtf - detect if the given timings follow the GTF standard | |
95 | + * @frame_height - the total height of the frame (including blanking) in lines. | |
96 | + * @hfreq - the horizontal frequency in Hz. | |
97 | + * @vsync - the height of the vertical sync in lines. | |
98 | + * @polarities - the horizontal and vertical polarities (same as struct | |
99 | + * v4l2_bt_timings polarities). | |
100 | + * @aspect - preferred aspect ratio. GTF has no method of determining the | |
101 | + * aspect ratio in order to derive the image width from the | |
102 | + * image height, so it has to be passed explicitly. Usually | |
103 | + * the native screen aspect ratio is used for this. If it | |
104 | + * is not filled in correctly, then 16:9 will be assumed. | |
105 | + * @fmt - the resulting timings. | |
106 | + * | |
107 | + * This function will attempt to detect if the given values correspond to a | |
108 | + * valid GTF format. If so, then it will return true, and fmt will be filled | |
109 | + * in with the found GTF timings. | |
110 | + */ | |
111 | +bool v4l2_detect_gtf(unsigned frame_height, unsigned hfreq, unsigned vsync, | |
112 | + u32 polarities, struct v4l2_fract aspect, | |
113 | + struct v4l2_dv_timings *fmt); | |
114 | + | |
115 | +/** v4l2_calc_aspect_ratio - calculate the aspect ratio based on bytes | |
116 | + * 0x15 and 0x16 from the EDID. | |
117 | + * @hor_landscape - byte 0x15 from the EDID. | |
118 | + * @vert_portrait - byte 0x16 from the EDID. | |
119 | + * | |
120 | + * Determines the aspect ratio from the EDID. | |
121 | + * See VESA Enhanced EDID standard, release A, rev 2, section 3.6.2: | |
122 | + * "Horizontal and Vertical Screen Size or Aspect Ratio" | |
123 | + */ | |
124 | +struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait); | |
125 | + | |
67 | 126 | #endif |