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

📄 rtmp_init.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	// Read Tx power value for all channels	// Value from 1 - 0x7f. Default value is 24.	// Power value : 2.4G 0x00 (0) ~ 0x1F (31)	//             : 5.5G 0xF9 (-7) ~ 0x0F (15)		// 0. 11b/g, ch1 - ch 14	for (i = 0; i < 7; i++)	{//		Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2);//		Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2);		RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2, Power.word);		RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2, Power2.word);		pAd->TxPower[i * 2].Channel = i * 2 + 1;		pAd->TxPower[i * 2 + 1].Channel = i * 2 + 2;		if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0))			pAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER;		else			pAd->TxPower[i * 2].Power = Power.field.Byte0;		if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0))			pAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER;		else			pAd->TxPower[i * 2 + 1].Power = Power.field.Byte1;		if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0))			pAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER;		else			pAd->TxPower[i * 2].Power2 = Power2.field.Byte0;		if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0))			pAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER;		else			pAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1;	}		// 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz)	// 1.1 Fill up channel	choffset = 14;	for (i = 0; i < 4; i++)	{		pAd->TxPower[3 * i + choffset + 0].Channel	= 36 + i * 8 + 0;		pAd->TxPower[3 * i + choffset + 0].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 0].Power2	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 1].Channel	= 36 + i * 8 + 2;		pAd->TxPower[3 * i + choffset + 1].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 1].Power2	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 2].Channel	= 36 + i * 8 + 4;		pAd->TxPower[3 * i + choffset + 2].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 2].Power2	= DEFAULT_RF_TX_POWER;	}	// 1.2 Fill up power	for (i = 0; i < 6; i++)	{//		Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2);//		Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2);		RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2, Power.word);		RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2, Power2.word);		if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))			pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;		if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))			pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;					if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))			pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;		if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))			pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;				}		// 2. HipperLAN 2 100, 102 ,104; 108, 110, 112; 116, 118, 120; 124, 126, 128; 132, 134, 136; 140 (including central frequency in BW 40MHz)	// 2.1 Fill up channel	choffset = 14 + 12;	for (i = 0; i < 5; i++)	{		pAd->TxPower[3 * i + choffset + 0].Channel	= 100 + i * 8 + 0;		pAd->TxPower[3 * i + choffset + 0].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 0].Power2	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 1].Channel	= 100 + i * 8 + 2;		pAd->TxPower[3 * i + choffset + 1].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 1].Power2	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 2].Channel	= 100 + i * 8 + 4;		pAd->TxPower[3 * i + choffset + 2].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 2].Power2	= DEFAULT_RF_TX_POWER;	}	pAd->TxPower[3 * 5 + choffset + 0].Channel		= 140;	pAd->TxPower[3 * 5 + choffset + 0].Power		= DEFAULT_RF_TX_POWER;	pAd->TxPower[3 * 5 + choffset + 0].Power2		= DEFAULT_RF_TX_POWER;	// 2.2 Fill up power	for (i = 0; i < 8; i++)	{//		Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2);//		Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2);		RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);		RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);		if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))			pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;		if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))			pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;					if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))			pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;		if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))			pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;				}	// 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165 (including central frequency in BW 40MHz)	// 3.1 Fill up channel	choffset = 14 + 12 + 16;	for (i = 0; i < 2; i++)	{		pAd->TxPower[3 * i + choffset + 0].Channel	= 149 + i * 8 + 0;		pAd->TxPower[3 * i + choffset + 0].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 0].Power2	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 1].Channel	= 149 + i * 8 + 2;		pAd->TxPower[3 * i + choffset + 1].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 1].Power2	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 2].Channel	= 149 + i * 8 + 4;		pAd->TxPower[3 * i + choffset + 2].Power	= DEFAULT_RF_TX_POWER;		pAd->TxPower[3 * i + choffset + 2].Power2	= DEFAULT_RF_TX_POWER;	}	pAd->TxPower[3 * 2 + choffset + 0].Channel		= 165;	pAd->TxPower[3 * 2 + choffset + 0].Power		= DEFAULT_RF_TX_POWER;	pAd->TxPower[3 * 2 + choffset + 0].Power2		= DEFAULT_RF_TX_POWER;	// 3.2 Fill up power	for (i = 0; i < 4; i++)	{//		Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2);//		Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2);		RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);		RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);		if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))			pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;		if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))			pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;					if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))			pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;		if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))			pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;				}	// 4. Print and Debug	choffset = 14 + 12 + 16 + 7;	}/*	========================================================================		Routine Description:		Read the following from the registry		1. All the parameters		2. NetworkAddres	Arguments:		Adapter						Pointer to our adapter		WrapperConfigurationContext	For use by NdisOpenConfiguration	Return Value:		NDIS_STATUS_SUCCESS		NDIS_STATUS_FAILURE		NDIS_STATUS_RESOURCES	IRQL = PASSIVE_LEVEL	Note:		========================================================================*/NDIS_STATUS	NICReadRegParameters(	IN	PRTMP_ADAPTER		pAd,	IN	NDIS_HANDLE			WrapperConfigurationContext	){	NDIS_STATUS						Status = NDIS_STATUS_SUCCESS;	DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));	return Status;}#ifdef RT30xx/*	========================================================================	Routine Description:		For RF filter calibration purpose	Arguments:		pAd                          Pointer to our adapter	Return Value:		None	IRQL = PASSIVE_LEVEL	========================================================================*/VOID RTMPFilterCalibration(	IN PRTMP_ADAPTER pAd){	UCHAR	R55x = 0, value, FilterTarget = 0x1E, BBPValue=0;	UINT	loop = 0, count = 0, loopcnt = 0, ReTry = 0;	UCHAR	RF_R24_Value = 0;	// Give bbp filter initial value	pAd->Mlme.CaliBW20RfR24 = 0x1F;	pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40	do 	{		if (loop == 1)	//BandWidth = 40 MHz		{			// Write 0x27 to RF_R24 to program filter			RF_R24_Value = 0x27;			RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);			if (IS_RT3090(pAd))				FilterTarget = 0x15;			else				FilterTarget = 0x19;			// when calibrate BW40, BBP mask must set to BW40.			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);			BBPValue&= (~0x18);			BBPValue|= (0x10);			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);			// set to BW40			RT30xxReadRFRegister(pAd, RF_R31, &value);			value |= 0x20;			RT30xxWriteRFRegister(pAd, RF_R31, value);		}		else			//BandWidth = 20 MHz		{			// Write 0x07 to RF_R24 to program filter			RF_R24_Value = 0x07;			RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);			if (IS_RT3090(pAd))				FilterTarget = 0x13;			else				FilterTarget = 0x16;			// set to BW20			RT30xxReadRFRegister(pAd, RF_R31, &value);			value &= (~0x20);			RT30xxWriteRFRegister(pAd, RF_R31, value);		}		// Write 0x01 to RF_R22 to enable baseband loopback mode		RT30xxReadRFRegister(pAd, RF_R22, &value);		value |= 0x01;		RT30xxWriteRFRegister(pAd, RF_R22, value);		// Write 0x00 to BBP_R24 to set power & frequency of passband test tone		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);		do		{			// Write 0x90 to BBP_R25 to transmit test tone			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);			RTMPusecDelay(1000);			// Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);			R55x = value & 0xFF;		} while ((ReTry++ < 100) && (R55x == 0));				// Write 0x06 to BBP_R24 to set power & frequency of stopband test tone		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06);		while(TRUE)		{			// Write 0x90 to BBP_R25 to transmit test tone			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);			//We need to wait for calibration			RTMPusecDelay(1000);			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);			value &= 0xFF;			if ((R55x - value) < FilterTarget)			{				RF_R24_Value ++;			}			else if ((R55x - value) == FilterTarget)			{				RF_R24_Value ++;				count ++;			}			else			{				break;			}			// prevent infinite loop cause driver hang.			if (loopcnt++ > 100)			{				DBGPRINT(RT_DEBUG_ERROR, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt));				break;			}			// Write RF_R24 to program filter			RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);		}		if (count > 0)		{			RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));		}		// Store for future usage		if (loopcnt < 100)		{			if (loop++ == 0)			{				//BandWidth = 20 MHz				pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value;			}			else			{				//BandWidth = 40 MHz				pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value;				break;			}		}		else 			break;		RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);		// reset count		count = 0;	} while(TRUE);	//	// Set back to initial state	//	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);	RT30xxReadRFRegister(pAd, RF_R22, &value);	value &= ~(0x01);	RT30xxWriteRFRegister(pAd, RF_R22, value);	// set BBP back to BW20	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);	BBPValue&= (~0x18);	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);	DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));}#endif // RT30xx //#ifdef RT3070VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd){	INT i;	// Driver must read EEPROM to get RfIcType before initial RF registers	// Initialize RF register to default value	if (IS_RT3070(pAd) || IS_RT3071(pAd))	{		// Init RF calibration		// Driver should toggle RF R30 bit7 before init RF registers		UINT32 RfReg = 0;          		UINT32 data;          		RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);		RfReg |= 0x80;		RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);		RTMPusecDelay(1000);		RfReg &= 0x7F;		RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);        		// Initialize RF register to default value		for (i = 0; i < NUM_RF_REG_PARMS; i++)		{			RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);		} 		// add by johnli		if (IS_RT3070(pAd))		{			//  Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate			RTUSBReadMACRegister(pAd, LDO_CFG0, &data);			data = ((data & 0xF0FFFFFF) | 0x0D000000);			RTUSBWriteMACRegister(pAd, LDO_CFG0, data);		}		else if (IS_RT3071(pAd))		{			// Driver should set RF R6 bit6 on before init RF registers					RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg);			RfReg |= 0x40;			RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg);			// init R31			RT30xxWriteRFRegister(pAd, RF_R31, 0x14);			// RT3071 version E has fixed this issue			if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211))			{				// patch tx EVM issue temporarily				RTUSBReadMACRegister(pAd, LDO_CFG0, &data);				data = ((data & 0xE0FFFFFF) | 0x0D000000);				RTUSBWriteMACRegister(pAd, LDO_CFG0, data);			}			else			{				RTMP_IO_READ32(pAd, LDO_CFG0, &data);				data = ((data & 0xE0FFFFFF) | 0x01000000);				RTMP_IO_WRITE32(pAd, LDO_CFG0, data);			}			// patch LNA_PE_G1 failed issue			RTUSBReadMACRegister(pAd, GPIO_SWITCH, &data);			data &= ~(0x20);			RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data);		}				//For RF filter Calibration		RTMPFilterCalibration(pAd);		// Initialize RF R27 register, set RF R27 must be behind RTMPFilterCalibration()		if ((pAd->MACVersion & 0xffff) < 0x0211)			RT30xxWriteRFRegister(pAd, RF_R27, 0x3);		// set led open drain enable		RTUSBReadMACRegister(pAd, OPT_14, &data);		data |= 0x01;		RTUSBWriteMACRegister(pAd, OPT_14, data);

⌨️ 快捷键说明

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