drx397xd.c

来自「trident tm5600的linux驱动」· C语言 代码 · 共 1,600 行 · 第 1/3 页

C
1,600
字号
	*lockstat = 0;	rc = RD16(s, 0x082004b);	if (rc < 0)		return rc;	if (s->config.d60 != 2)		return 0;	if ((rc & 7) == 7)		*lockstat |= 1;	if ((rc & 3) == 3)		*lockstat |= 2;	if (rc & 1)		*lockstat |= 4;	return 0;}static int CorrectSysClockDeviation(struct drx397xD_state *s){	int rc = -EINVAL;	int lockstat;	u32 clk, clk_limit;	pr_debug("%s\n", __func__);	if (s->config.d5C == 0) {		EXIT_RC(WR16(s, 0x08200e8, 0x010));		EXIT_RC(WR16(s, 0x08200e9, 0x113));		s->config.d5C = 1;		return rc;	}	if (s->config.d5C != 1)		goto exit_rc;	rc = RD16(s, 0x0820048);	rc = GetLockStatus(s, &lockstat);	if (rc < 0)		goto exit_rc;	if ((lockstat & 1) == 0)		goto exit_rc;	EXIT_RC(WR16(s, 0x0420033, 0x200));	EXIT_RC(WR16(s, 0x0420034, 0xc5));	EXIT_RC(WR16(s, 0x0420035, 0x10));	EXIT_RC(WR16(s, 0x0420036, 0x1));	EXIT_RC(WR16(s, 0x0420037, 0xa));	EXIT_RC(HI_Command(s, 6));	EXIT_RC(RD16(s, 0x0420040));	clk = rc;	EXIT_RC(RD16(s, 0x0420041));	clk |= rc << 16;	if (clk <= 0x26ffff)		goto exit_rc;	if (clk > 0x610000)		goto exit_rc;	if (!s->bandwidth_parm)		return -EINVAL;	/* round & convert to Hz */	clk = ((u64) (clk + 0x800000) * s->bandwidth_parm + (1 << 20)) >> 21;	clk_limit = s->config.f_osc * MAX_CLOCK_DRIFT / 1000;	if (clk - s->config.f_osc * 1000 + clk_limit <= 2 * clk_limit) {		s->f_osc = clk;		pr_debug("%s: osc %d %d [Hz]\n", __func__,			 s->config.f_osc * 1000, clk - s->config.f_osc * 1000);	}	rc = WR16(s, 0x08200e8, 0);exit_rc:	return rc;}static int ConfigureMPEGOutput(struct drx397xD_state *s, int type){	int rc, si, bp;	pr_debug("%s\n", __func__);	si = s->config.wA0;	if (s->config.w98 == 0) {		si |= 1;		bp = 0;	} else {		si &= ~1;		bp = 0x200;	}	if (s->config.w9A == 0)		si |= 0x80;	else		si &= ~0x80;	EXIT_RC(WR16(s, 0x2150045, 0));	EXIT_RC(WR16(s, 0x2150010, si));	EXIT_RC(WR16(s, 0x2150011, bp));	rc = WR16(s, 0x2150012, (type == 0 ? 0xfff : 0));exit_rc:	return rc;}static int drx_tune(struct drx397xD_state *s,		    struct dvb_frontend_parameters *fep){	u16 v22 = 0;	u16 v1C = 0;	u16 v1A = 0;	u16 v18 = 0;	u32 edi = 0, ebx = 0, ebp = 0, edx = 0;	u16 v20 = 0, v1E = 0, v16 = 0, v14 = 0, v12 = 0, v10 = 0, v0E = 0;	int rc, df_tuner;	int a, b, c, d;	pr_debug("%s %d\n", __func__, s->config.d60);	if (s->config.d60 != 2)		goto set_tuner;	rc = CorrectSysClockDeviation(s);	if (rc < 0)		goto set_tuner;	s->config.d60 = 1;	rc = ConfigureMPEGOutput(s, 0);	if (rc < 0)		goto set_tuner;#if 0	if (s->chip_rev != DRXD_FW_B1) {		rc = WR16(s, 0x2150000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x2110000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x0800000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x2800000, 0);	} else {		rc = WR16(s, 0x0800000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x2800000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x1000000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x1400000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x1800000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x1c00000, 0);		if (rc < 0)			goto loc_800111A;		rc = WR16(s, 0x2000000, 0);	}      loc_800111A:#endifset_tuner:	rc = PLL_Set(s, fep, &df_tuner);	if (rc < 0) {		printk(KERN_ERR "Error in pll_set\n");		goto exit_rc;	}	msleep(200);	a = rc = RD16(s, 0x2150016);	if (rc < 0)		goto exit_rc;	b = rc = RD16(s, 0x2150010);	if (rc < 0)		goto exit_rc;	c = rc = RD16(s, 0x2150034);	if (rc < 0)		goto exit_rc;	d = rc = RD16(s, 0x2150035);	if (rc < 0)		goto exit_rc;	rc = WR16(s, 0x2150014, c);	rc = WR16(s, 0x2150015, d);	rc = WR16(s, 0x2150010, 0);	rc = WR16(s, 0x2150000, 2);	rc = WR16(s, 0x2150036, 0x0fff);	rc = WR16(s, 0x2150016, a);	rc = WR16(s, 0x2150010, 2);	rc = WR16(s, 0x2150007, 0);	rc = WR16(s, 0x2150000, 1);	rc = WR16(s, 0x2110000, 0);	rc = WR16(s, 0x0800000, 0);	rc = WR16(s, 0x2800000, 0);	rc = WR16(s, 0x2110010, 0x664);	rc = write_fw(s, DRXD_ResetECRAM);	rc = WR16(s, 0x2110000, 1);	rc = write_fw(s, DRXD_InitSC);	if (rc < 0)		goto exit_rc;	rc = SetCfgIfAgc(s, &s->config.ifagc);	if (rc < 0)		goto exit_rc;	rc = SetCfgRfAgc(s, &s->config.rfagc);	if (rc < 0)		goto exit_rc;	if (fep->u.ofdm.transmission_mode != TRANSMISSION_MODE_2K)		v22 = 1;	switch (fep->u.ofdm.transmission_mode) {	case TRANSMISSION_MODE_8K:		edi = 1;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x2010010, 0);		if (rc < 0)			break;		v1C = 0x63;		v1A = 0x53;		v18 = 0x43;		break;	default:		edi = 0;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x2010010, 1);		if (rc < 0)			break;		v1C = 0x61;		v1A = 0x47;		v18 = 0x41;	}	switch (fep->u.ofdm.guard_interval) {	case GUARD_INTERVAL_1_4:		edi |= 0x0c;		break;	case GUARD_INTERVAL_1_8:		edi |= 0x08;		break;	case GUARD_INTERVAL_1_16:		edi |= 0x04;		break;	case GUARD_INTERVAL_1_32:		break;	default:		v22 |= 2;	}	ebx = 0;	ebp = 0;	v20 = 0;	v1E = 0;	v16 = 0;	v14 = 0;	v12 = 0;	v10 = 0;	v0E = 0;	switch (fep->u.ofdm.hierarchy_information) {	case HIERARCHY_1:		edi |= 0x40;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x1c10047, 1);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x2010012, 1);		if (rc < 0)			goto exit_rc;		ebx = 0x19f;		ebp = 0x1fb;		v20 = 0x0c0;		v1E = 0x195;		v16 = 0x1d6;		v14 = 0x1ef;		v12 = 4;		v10 = 5;		v0E = 5;		break;	case HIERARCHY_2:		edi |= 0x80;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x1c10047, 2);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x2010012, 2);		if (rc < 0)			goto exit_rc;		ebx = 0x08f;		ebp = 0x12f;		v20 = 0x0c0;		v1E = 0x11e;		v16 = 0x1d6;		v14 = 0x15e;		v12 = 4;		v10 = 5;		v0E = 5;		break;	case HIERARCHY_4:		edi |= 0xc0;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x1c10047, 3);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x2010012, 3);		if (rc < 0)			goto exit_rc;		ebx = 0x14d;		ebp = 0x197;		v20 = 0x0c0;		v1E = 0x1ce;		v16 = 0x1d6;		v14 = 0x11a;		v12 = 4;		v10 = 6;		v0E = 5;		break;	default:		v22 |= 8;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x1c10047, 0);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x2010012, 0);		if (rc < 0)			goto exit_rc;				/* QPSK    QAM16  QAM64	*/		ebx = 0x19f;	/*                 62	*/		ebp = 0x1fb;	/*                 15	*/		v20 = 0x16a;	/*  62			*/		v1E = 0x195;	/*         62		*/		v16 = 0x1bb;	/*  15			*/		v14 = 0x1ef;	/*         15		*/		v12 = 5;	/*  16			*/		v10 = 5;	/*         16		*/		v0E = 5;	/*                 16	*/	}	switch (fep->u.ofdm.constellation) {	default:		v22 |= 4;	case QPSK:		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x1c10046, 0);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x2010011, 0);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001a, 0x10);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001b, 0);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001c, 0);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10062, v20);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c1002a, v1C);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10015, v16);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10016, v12);		if (rc < 0)			goto exit_rc;		break;	case QAM_16:		edi |= 0x10;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x1c10046, 1);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x2010011, 1);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001a, 0x10);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001b, 4);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001c, 0);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10062, v1E);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c1002a, v1A);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10015, v14);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10016, v10);		if (rc < 0)			goto exit_rc;		break;	case QAM_64:		edi |= 0x20;		rc = WR16(s, 0x1c10046, 2);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x2010011, 2);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001a, 0x20);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001b, 8);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x201001c, 2);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10062, ebx);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c1002a, v18);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10015, ebp);		if (rc < 0)			goto exit_rc;		rc = WR16(s, 0x1c10016, v0E);		if (rc < 0)			goto exit_rc;		break;	}	if (s->config.s20d24 == 1) {		rc = WR16(s, 0x2010013, 0);	} else {		rc = WR16(s, 0x2010013, 1);		edi |= 0x1000;	}	switch (fep->u.ofdm.code_rate_HP) {	default:		v22 |= 0x10;	case FEC_1_2:		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x2090011, 0);		break;	case FEC_2_3:		edi |= 0x200;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x2090011, 1);		break;	case FEC_3_4:		edi |= 0x400;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x2090011, 2);		break;	case FEC_5_6:		/* 5 */		edi |= 0x600;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x2090011, 3);		break;	case FEC_7_8:		/* 7 */		edi |= 0x800;		if (s->chip_rev == DRXD_FW_B1)			break;		rc = WR16(s, 0x2090011, 4);		break;	};	if (rc < 0)		goto exit_rc;	switch (fep->u.ofdm.bandwidth) {	default:		rc = -EINVAL;		goto exit_rc;	case BANDWIDTH_8_MHZ:	/* 0 */	case BANDWIDTH_AUTO:		rc = WR16(s, 0x0c2003f, 0x32);		s->bandwidth_parm = ebx = 0x8b8249;		edx = 0;		break;	case BANDWIDTH_7_MHZ:		rc = WR16(s, 0x0c2003f, 0x3b);		s->bandwidth_parm = ebx = 0x7a1200;		edx = 0x4807;		break;	case BANDWIDTH_6_MHZ:		rc = WR16(s, 0x0c2003f, 0x47);		s->bandwidth_parm = ebx = 0x68a1b6;		edx = 0x0f07;		break;	};	if (rc < 0)		goto exit_rc;	rc = WR16(s, 0x08200ec, edx);	if (rc < 0)		goto exit_rc;	rc = RD16(s, 0x0820050);	if (rc < 0)		goto exit_rc;	rc = WR16(s, 0x0820050, rc);	{		/* Configure bandwidth specific factor */		ebx = div64_u64(((u64) (s->f_osc) << 21) + (ebx >> 1),

⌨️ 快捷键说明

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