⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cx88-tvaudio.c

📁 优龙2410linux2.6.8内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		{ AUD_PDET_SRC,                    0x00000014 },		{ AUD_PDET_SHIFT,                  0x00000000 },		{ AUD_DEEMPH0_SRC_SEL,             0x00000011 },		{ AUD_DEEMPH1_SRC_SEL,             0x00000011 },		{ AUD_DEEMPH0_SHIFT,               0x00000000 },		{ AUD_DEEMPH1_SHIFT,               0x00000000 },		{ AUD_DEEMPH0_G0,                  0x00007000 },		{ AUD_DEEMPH0_A0,                  0x00000000 },		{ AUD_DEEMPH0_B0,                  0x00000000 },		{ AUD_DEEMPH0_A1,                  0x00000000 },		{ AUD_DEEMPH0_B1,                  0x00000000 },		{ AUD_DEEMPH1_G0,                  0x00007000 },		{ AUD_DEEMPH1_A0,                  0x00000000 },		{ AUD_DEEMPH1_B0,                  0x00000000 },		{ AUD_DEEMPH1_A1,                  0x00000000 },		{ AUD_DEEMPH1_B1,                  0x00000000 },		{ AUD_DMD_RA_DDS,                  0x00f5c285 },		{ AUD_RATE_ADJ1,                   0x00000100 },		{ AUD_RATE_ADJ2,                   0x00000200 },		{ AUD_RATE_ADJ3,                   0x00000300 },		{ AUD_RATE_ADJ4,                   0x00000400 },		{ AUD_RATE_ADJ5,                   0x00000500 },		{ AUD_C2_UP_THR,                   0x00005400 },		{ AUD_C2_LO_THR,                   0x00003000 },		{ AUD_C1_UP_THR,                   0x00007000 },		{ AUD_C2_LO_THR,                   0x00005400 },		{ AUD_CTL,                         0x0000100c },		{ AUD_DCOC_0_SRC,                  0x00000021 },		{ AUD_DCOC_1_SRC,                  0x00000003 },		{ AUD_DCOC1_SHIFT,                 0x00000000 },		{ AUD_DCOC_1_SHIFT_IN0,            0x0000000a },		{ AUD_DCOC_1_SHIFT_IN1,            0x00000008 },		{ AUD_DCOC_PASS_IN,                0x00000000 },		{ AUD_DCOC_2_SRC,                  0x0000001b },		{ AUD_IIR4_0_SEL,                  0x0000001d },		{ AUD_POLY0_DDS_CONSTANT,          0x000e4db2 },		{ AUD_PHASE_FIX_CTL,               0x00000000 },		{ AUD_CORDIC_SHIFT_1,              0x00000007 },		{ AUD_PLL_EN,                      0x00000000 },		{ AUD_PLL_PRESCALE,                0x00000002 },		{ AUD_PLL_INT,                     0x0000001e },		{ AUD_OUT1_SHIFT,                  0x00000000 },		{ /* end of list */ },	};	dprintk("%s (status: unknown)\n",__FUNCTION__);        set_audio_start(dev, 0x0004,			0 /* FIXME */);	set_audio_registers(dev, nicam_l);        set_audio_finish(dev);}static void set_audio_standard_A2(struct cx8800_dev *dev){	/* from dscaler cvs */	static const struct rlist a2_common[] = {		{ AUD_PDF_DDS_CNST_BYTE2,     0x06 },		{ AUD_PDF_DDS_CNST_BYTE1,     0x82 },		{ AUD_PDF_DDS_CNST_BYTE0,     0x12 },		{ AUD_QAM_MODE,		      0x05 },		{ AUD_PHACC_FREQ_8MSB,	      0x34 },		{ AUD_PHACC_FREQ_8LSB,	      0x4c },		{ AUD_RATE_ADJ1,	0x00001000 },		{ AUD_RATE_ADJ2,	0x00002000 },		{ AUD_RATE_ADJ3,	0x00003000 },		{ AUD_RATE_ADJ4,	0x00004000 },		{ AUD_RATE_ADJ5,	0x00005000 },		{ AUD_THR_FR,		0x00000000 },		{ AAGC_HYST,		0x0000001a },		{ AUD_PILOT_BQD_1_K0,	0x0000755b },		{ AUD_PILOT_BQD_1_K1,	0x00551340 },		{ AUD_PILOT_BQD_1_K2,	0x006d30be },		{ AUD_PILOT_BQD_1_K3,	0xffd394af },		{ AUD_PILOT_BQD_1_K4,	0x00400000 },		{ AUD_PILOT_BQD_2_K0,	0x00040000 },		{ AUD_PILOT_BQD_2_K1,	0x002a4841 },		{ AUD_PILOT_BQD_2_K2,	0x00400000 },		{ AUD_PILOT_BQD_2_K3,	0x00000000 },		{ AUD_PILOT_BQD_2_K4,	0x00000000 },		{ AUD_MODE_CHG_TIMER,	0x00000040 },		{ AUD_START_TIMER,	0x00000200 },		{ AUD_AFE_12DB_EN,	0x00000000 },		{ AUD_CORDIC_SHIFT_0,	0x00000007 },		{ AUD_CORDIC_SHIFT_1,	0x00000007 },		{ AUD_DEEMPH0_G0,	0x00000380 },		{ AUD_DEEMPH1_G0,	0x00000380 },		{ AUD_DCOC_0_SRC,	0x0000001a },		{ AUD_DCOC0_SHIFT,	0x00000000 },		{ AUD_DCOC_0_SHIFT_IN0,	0x0000000a },		{ AUD_DCOC_0_SHIFT_IN1,	0x00000008 },		{ AUD_DCOC_PASS_IN,	0x00000003 },		{ AUD_IIR3_0_SEL,	0x00000021 },		{ AUD_DN2_AFC,		0x00000002 },		{ AUD_DCOC_1_SRC,	0x0000001b },		{ AUD_DCOC1_SHIFT,	0x00000000 },		{ AUD_DCOC_1_SHIFT_IN0,	0x0000000a },		{ AUD_DCOC_1_SHIFT_IN1,	0x00000008 },		{ AUD_IIR3_1_SEL,	0x00000023 },		{ AUD_RDSI_SEL,		0x00000017 },		{ AUD_RDSI_SHIFT,	0x00000000 },		{ AUD_RDSQ_SEL,		0x00000017 },		{ AUD_RDSQ_SHIFT,	0x00000000 },		{ AUD_POLYPH80SCALEFAC,	0x00000001 },		{ /* end of list */ },	};	static const struct rlist a2_table1[] = {		// PAL-BG		{ AUD_DMD_RA_DDS,	0x002a73bd },		{ AUD_C1_UP_THR,	0x00007000 },		{ AUD_C1_LO_THR,	0x00005400 },		{ AUD_C2_UP_THR,	0x00005400 },		{ AUD_C2_LO_THR,	0x00003000 },		{ /* end of list */ },	};	static const struct rlist a2_table2[] = {		// PAL-DK		{ AUD_DMD_RA_DDS,	0x002a73bd },		{ AUD_C1_UP_THR,	0x00007000 },		{ AUD_C1_LO_THR,	0x00005400 },		{ AUD_C2_UP_THR,	0x00005400 },		{ AUD_C2_LO_THR,	0x00003000 },		{ AUD_DN0_FREQ,		0x00003a1c },		{ AUD_DN2_FREQ,		0x0000d2e0 },		{ /* end of list */ },	};	static const struct rlist a2_table3[] = {		// unknown, probably NTSC-M		{ AUD_DMD_RA_DDS,	0x002a2873 },		{ AUD_C1_UP_THR,	0x00003c00 },		{ AUD_C1_LO_THR,	0x00003000 },		{ AUD_C2_UP_THR,	0x00006000 },		{ AUD_C2_LO_THR,	0x00003c00 },		{ AUD_DN0_FREQ,		0x00002836 },		{ AUD_DN1_FREQ,		0x00003418 },		{ AUD_DN2_FREQ,		0x000029c7 },		{ AUD_POLY0_DDS_CONSTANT, 0x000a7540 },		{ /* end of list */ },	};	set_audio_start(dev, 0x0004, EN_DMTRX_SUMDIFF | EN_A2_AUTO_STEREO);	set_audio_registers(dev, a2_common);	switch (dev->tvaudio) {	case WW_A2_BG:		dprintk("%s PAL-BG A2 (status: known-good)\n",__FUNCTION__);		set_audio_registers(dev, a2_table1);		break;	case WW_A2_DK:		dprintk("%s PAL-DK A2 (status: known-good)\n",__FUNCTION__);		set_audio_registers(dev, a2_table2);		break;	case WW_A2_M:		dprintk("%s NTSC-M A2 (status: unknown)\n",__FUNCTION__);		set_audio_registers(dev, a2_table3);		break;	};	set_audio_finish(dev);}static void set_audio_standard_EIAJ(struct cx8800_dev *dev){	static const struct rlist eiaj[] = {		/* TODO: eiaj register settings are not there yet ... */		{ /* end of list */ },	};	dprintk("%s (status: unknown)\n",__FUNCTION__);	set_audio_start(dev, 0x0002, EN_EIAJ_AUTO_STEREO);	set_audio_registers(dev, eiaj);	set_audio_finish(dev);}static void set_audio_standard_FM(struct cx8800_dev *dev){#if 0 /* FIXME */	switch (dev->audio_properties.FM_deemphasis)	{		case WW_FM_DEEMPH_50:			//Set De-emphasis filter coefficients for 50 usec			cx_write(AUD_DEEMPH0_G0, 0x0C45);			cx_write(AUD_DEEMPH0_A0, 0x6262);			cx_write(AUD_DEEMPH0_B0, 0x1C29);			cx_write(AUD_DEEMPH0_A1, 0x3FC66);			cx_write(AUD_DEEMPH0_B1, 0x399A);			cx_write(AUD_DEEMPH1_G0, 0x0D80);			cx_write(AUD_DEEMPH1_A0, 0x6262);			cx_write(AUD_DEEMPH1_B0, 0x1C29);			cx_write(AUD_DEEMPH1_A1, 0x3FC66);			cx_write(AUD_DEEMPH1_B1, 0x399A);						break;		case WW_FM_DEEMPH_75:			//Set De-emphasis filter coefficients for 75 usec			cx_write(AUD_DEEMPH0_G0, 0x91B );			cx_write(AUD_DEEMPH0_A0, 0x6B68);			cx_write(AUD_DEEMPH0_B0, 0x11EC);			cx_write(AUD_DEEMPH0_A1, 0x3FC66);			cx_write(AUD_DEEMPH0_B1, 0x399A);			cx_write(AUD_DEEMPH1_G0, 0xAA0 );			cx_write(AUD_DEEMPH1_A0, 0x6B68);			cx_write(AUD_DEEMPH1_B0, 0x11EC);			cx_write(AUD_DEEMPH1_A1, 0x3FC66);			cx_write(AUD_DEEMPH1_B1, 0x399A);			break;	}#endif	dprintk("%s (status: unknown)\n",__FUNCTION__);	set_audio_start(dev, 0x0020, EN_FMRADIO_AUTO_STEREO);	// AB: 10/2/01: this register is not being reset appropriately on occasion.	cx_write(AUD_POLYPH80SCALEFAC,3);	set_audio_finish(dev);}/* ----------------------------------------------------------- */void cx88_set_tvaudio(struct cx8800_dev *dev){	switch (dev->tvaudio) {	case WW_BTSC:		set_audio_standard_BTSC(dev,0);		break;	case WW_NICAM_I:	case WW_NICAM_BGDKL:		set_audio_standard_NICAM(dev);		break;	case WW_A2_BG:	case WW_A2_DK:	case WW_A2_M:		set_audio_standard_A2(dev);		break;	case WW_EIAJ:		set_audio_standard_EIAJ(dev);		break;	case WW_FM:		set_audio_standard_FM(dev);		break;	case WW_SYSTEM_L_AM:		set_audio_standard_NICAM_L(dev);		break;	case WW_NONE:	default:		printk("%s: unknown tv audio mode [%d]\n",		       dev->name, dev->tvaudio);		break;	}	return;}void cx88_get_stereo(struct cx8800_dev *dev, struct v4l2_tuner *t){	static char *m[] = {"stereo", "dual mono", "mono", "sap"};	static char *p[] = {"no pilot", "pilot c1", "pilot c2", "?"};	u32 reg,mode,pilot;	reg   = cx_read(AUD_STATUS);	mode  = reg & 0x03;	pilot = (reg >> 2) & 0x03;	dprintk("AUD_STATUS: 0x%x [%s/%s] ctl=%s\n",		reg, m[mode], p[pilot],		aud_ctl_names[cx_read(AUD_CTL) & 63]);	t->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_SAP |		V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;	t->rxsubchans = V4L2_TUNER_SUB_MONO;	t->audmode    = V4L2_TUNER_MODE_MONO;	switch (dev->tvaudio) {	case WW_A2_BG:	case WW_A2_DK:	case WW_A2_M: 		if (1 == pilot) {			/* stereo */			t->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;			if (0 == mode)				t->audmode = V4L2_TUNER_MODE_STEREO;		} 		if (2 == pilot) {			/* dual language -- FIXME */			t->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;			t->audmode = V4L2_TUNER_MODE_LANG1;		}		break;	case WW_NICAM_BGDKL:		if (0 == mode)			t->audmode = V4L2_TUNER_MODE_STEREO;		break;	default:		t->rxsubchans = V4L2_TUNER_SUB_MONO;		t->audmode    = V4L2_TUNER_MODE_MONO;		break;	}	return;}void cx88_set_stereo(struct cx8800_dev *dev, u32 mode){	u32 ctl  = UNSET;	u32 mask = UNSET;	switch (dev->tvaudio) {	case WW_A2_BG:	case WW_A2_DK:	case WW_A2_M:		switch (mode) {		case V4L2_TUNER_MODE_MONO:   		case V4L2_TUNER_MODE_LANG1:			ctl  = EN_A2_FORCE_MONO1;			mask = 0x3f;			break;		case V4L2_TUNER_MODE_LANG2:			ctl  = EN_A2_AUTO_MONO2;			mask = 0x3f;			break;		case V4L2_TUNER_MODE_STEREO:			ctl  = EN_A2_AUTO_STEREO | EN_DMTRX_SUMR;			mask = 0x8bf;			break;		}		break;	case WW_NICAM_BGDKL:		switch (mode) {		case V4L2_TUNER_MODE_MONO:   			ctl  = EN_NICAM_FORCE_MONO1;			mask = 0x3f;			break;		case V4L2_TUNER_MODE_LANG1:			ctl  = EN_NICAM_AUTO_MONO2;			mask = 0x3f;			break;		case V4L2_TUNER_MODE_STEREO:			ctl  = EN_NICAM_FORCE_STEREO | EN_DMTRX_LR;			mask = 0x93f;			break;		}		break;		case WW_FM:		switch (mode) {		case V4L2_TUNER_MODE_MONO:   			ctl  = EN_FMRADIO_FORCE_MONO;			mask = 0x3f;			break;		case V4L2_TUNER_MODE_STEREO:			ctl  = EN_FMRADIO_AUTO_STEREO;			mask = 0x3f;			break;		}		break;		}	if (UNSET != ctl) {		cx_write(AUD_SOFT_RESET, 0x0001);		cx_andor(AUD_CTL, mask,  ctl);		cx_write(AUD_SOFT_RESET, 0x0000);		dprintk("cx88_set_stereo: mask 0x%x, ctl 0x%x "			"[status=0x%x,ctl=0x%x,vol=0x%x]\n",			mask, ctl, cx_read(AUD_STATUS),			cx_read(AUD_CTL), cx_sread(SHADOW_AUD_VOL_CTL));	}	return;}/* just monitor the audio status for now ... */int cx88_audio_thread(void *data){	struct cx8800_dev *dev = data;	struct v4l2_tuner t;	daemonize("msp3400");	allow_signal(SIGTERM);	dprintk("cx88: tvaudio thread started\n");	for (;;) {		set_current_state(TASK_INTERRUPTIBLE);		schedule_timeout(HZ*3);		if (signal_pending(current))			break;		if (dev->shutdown)			break;		memset(&t,0,sizeof(t));		cx88_get_stereo(dev,&t);	}	dprintk("cx88: tvaudio thread exiting\n");        complete_and_exit(&dev->texit, 0);}/* * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -