Skip to content

Commit

Permalink
V4L/DVB (4980): Fixes bug 7267: PAL/60 is not working
Browse files Browse the repository at this point in the history
On cx88 driver, sampling rate should be at chroma subcarrier freq (FSC).
However, driver were programming wrong values for PAL/60, PAL/Nc and
NTSC 4.43. This patch do the proper calculation. It also calculates
htotal, hdelay and hactive constants, according with the sampling
rate.
It is tested with PAL/60 by Piotr Maksymuk and Olivier. Also tested with
the already-supported standards.

Test is still required for PAL/Nc.

Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
  • Loading branch information
Mauro Carvalho Chehab committed Dec 27, 2006
1 parent ed00b41 commit 315eb96
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 14 deletions.
35 changes: 22 additions & 13 deletions drivers/media/video/cx88/cx88-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -633,12 +633,12 @@ int cx88_reset(struct cx88_core *core)

static unsigned int inline norm_swidth(struct cx88_tvnorm *norm)
{
return (norm->id & V4L2_STD_625_50) ? 922 : 754;
return (norm->id & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 754 : 922;
}

static unsigned int inline norm_hdelay(struct cx88_tvnorm *norm)
{
return (norm->id & V4L2_STD_625_50) ? 186 : 135;
return (norm->id & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 135 : 186;
}

static unsigned int inline norm_vdelay(struct cx88_tvnorm *norm)
Expand All @@ -648,24 +648,33 @@ static unsigned int inline norm_vdelay(struct cx88_tvnorm *norm)

static unsigned int inline norm_fsc8(struct cx88_tvnorm *norm)
{
static const unsigned int ntsc = 28636360;
static const unsigned int pal = 35468950;
static const unsigned int palm = 28604892;

if (norm->id & V4L2_STD_PAL_M)
return palm;
return 28604892; // 3.575611 MHz

if (norm->id & (V4L2_STD_PAL_Nc))
return 28656448; // 3.582056 MHz

if (norm->id & V4L2_STD_NTSC) // All NTSC/M and variants
return 28636360; // 3.57954545 MHz +/- 10 Hz

return (norm->id & V4L2_STD_625_50) ? pal : ntsc;
/* SECAM have also different sub carrier for chroma,
but step_db and step_dr, at cx88_set_tvnorm already handles that.
The same FSC applies to PAL/BGDKIH, PAL/60, NTSC/4.43 and PAL/N
*/

return 35468950; // 4.43361875 MHz +/- 5 Hz
}

static unsigned int inline norm_htotal(struct cx88_tvnorm *norm)
{
/* Should always be Line Draw Time / (4*FSC) */

if (norm->id & V4L2_STD_PAL_M)
return 909;
unsigned int fsc4=norm_fsc8(norm)/2;

return (norm->id & V4L2_STD_625_50) ? 1135 : 910;
/* returns 4*FSC / vtotal / frames per seconds */
return (norm->id & V4L2_STD_625_50) ?
((fsc4+312)/625+12)/25 :
((fsc4+262)/525*1001+15000)/30000;
}

static unsigned int inline norm_vbipack(struct cx88_tvnorm *norm)
Expand All @@ -692,7 +701,7 @@ int cx88_set_scale(struct cx88_core *core, unsigned int width, unsigned int heig
value &= 0x3fe;
cx_write(MO_HDELAY_EVEN, value);
cx_write(MO_HDELAY_ODD, value);
dprintk(1,"set_scale: hdelay 0x%04x\n", value);
dprintk(1,"set_scale: hdelay 0x%04x (width %d)\n", value,swidth);

value = (swidth * 4096 / width) - 4096;
cx_write(MO_HSCALE_EVEN, value);
Expand Down
2 changes: 1 addition & 1 deletion drivers/media/video/cx88/cx88.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ struct cx88_tvnorm {

static unsigned int inline norm_maxw(struct cx88_tvnorm *norm)
{
return (norm->id & V4L2_STD_625_50) ? 768 : 640;
return (norm->id & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 720 : 768;
}


Expand Down

0 comments on commit 315eb96

Please sign in to comment.