Commit c3e75c7d authored by Martin Bugge's avatar Martin Bugge Committed by Mauro Carvalho Chehab

[media] v4l2-dv-timings: fix CVT calculation

This patch fixes two errors that caused incorrect format detections:
The first bug is in the calculation of the vertical backporch: the combined
period of vsync and backporch must *exceed* a certain minimum value, and not
be equal to it.
The second bug is a rounding error in the reduced blanking calculation:
expand the ideal_duty_cylce to be in parts per ten thousand to avoid
rounding errors.
Signed-off-by: default avatarMartin Bugge <marbugge@cisco.com>
Cc: Mats Randgaard <matrandg@cisco.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 1056e438
...@@ -286,14 +286,14 @@ bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync, ...@@ -286,14 +286,14 @@ bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync,
/* Vertical */ /* Vertical */
if (reduced_blanking) { if (reduced_blanking) {
v_fp = CVT_RB_V_FPORCH; v_fp = CVT_RB_V_FPORCH;
v_bp = (CVT_RB_MIN_V_BLANK * hfreq + 999999) / 1000000; v_bp = (CVT_RB_MIN_V_BLANK * hfreq + 1999999) / 1000000;
v_bp -= vsync + v_fp; v_bp -= vsync + v_fp;
if (v_bp < CVT_RB_MIN_V_BPORCH) if (v_bp < CVT_RB_MIN_V_BPORCH)
v_bp = CVT_RB_MIN_V_BPORCH; v_bp = CVT_RB_MIN_V_BPORCH;
} else { } else {
v_fp = CVT_MIN_V_PORCH_RND; v_fp = CVT_MIN_V_PORCH_RND;
v_bp = (CVT_MIN_VSYNC_BP * hfreq + 999999) / 1000000 - vsync; v_bp = (CVT_MIN_VSYNC_BP * hfreq + 1999999) / 1000000 - vsync;
if (v_bp < CVT_MIN_V_BPORCH) if (v_bp < CVT_MIN_V_BPORCH)
v_bp = CVT_MIN_V_BPORCH; v_bp = CVT_MIN_V_BPORCH;
...@@ -337,17 +337,16 @@ bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync, ...@@ -337,17 +337,16 @@ bool v4l2_detect_cvt(unsigned frame_height, unsigned hfreq, unsigned vsync,
frame_width = image_width + CVT_RB_H_BLANK; frame_width = image_width + CVT_RB_H_BLANK;
} else { } else {
unsigned ideal_duty_cycle_per_myriad =
100 * CVT_C_PRIME - (CVT_M_PRIME * 100000) / hfreq;
int h_blank; int h_blank;
unsigned ideal_duty_cycle = CVT_C_PRIME - (CVT_M_PRIME * 1000) / hfreq;
h_blank = (image_width * ideal_duty_cycle + (100 - ideal_duty_cycle) / 2) / if (ideal_duty_cycle_per_myriad < 2000)
(100 - ideal_duty_cycle); ideal_duty_cycle_per_myriad = 2000;
h_blank = h_blank - h_blank % (2 * CVT_CELL_GRAN);
if (h_blank * 100 / image_width < 20) { h_blank = image_width * ideal_duty_cycle_per_myriad /
h_blank = image_width / 5; (10000 - ideal_duty_cycle_per_myriad);
h_blank = (h_blank + 0x7) & ~0x7; h_blank = (h_blank / (2 * CVT_CELL_GRAN)) * 2 * CVT_CELL_GRAN;
}
pix_clk = (image_width + h_blank) * hfreq; pix_clk = (image_width + h_blank) * hfreq;
pix_clk = (pix_clk / CVT_PXL_CLK_GRAN) * CVT_PXL_CLK_GRAN; pix_clk = (pix_clk / CVT_PXL_CLK_GRAN) * CVT_PXL_CLK_GRAN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment