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

📄 rtmp_init.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	RTUSBReadEEPROM(pAd, EEPROM_BBP_BASE_OFFSET,				(PUCHAR)(pAd->EEPROMDefaultValue), 2 * NUM_EEPROM_BBP_PARMS);	// Bit of a swag, here - bb	for (i = 0; i < NUM_EEPROM_BBP_PARMS; i++) {		pAd->EEPROMDefaultValue[i] = le16_to_cpu(pAd->EEPROMDefaultValue[i]);	}	// We have to parse NIC configuration 0 at here.	// If TSSI did not have preloaded value, it should reset TxAutoAgc to false	// Therefore, we have to read TxAutoAgc control beforehand.	// Read Tx AGC control bit	Antenna.word = pAd->EEPROMDefaultValue[0];	if (Antenna.field.DynamicTxAgcControl == 1)		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;	else		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;	//	// Reset PhyMode if we don't support 802.11a	//	if ((pAd->PortCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->PortCfg.PhyMode == PHY_11A))	{		//		// Only RFIC_5226, RFIC_5225 suport 11a		//		if ((Antenna.field.RfIcType == RFIC_2528) || (Antenna.field.RfIcType == RFIC_2527))			pAd->PortCfg.PhyMode = PHY_11BG_MIXED;		//		// Reset Adhoc Mode if we don't support 802.11a		//		if ((pAd->PortCfg.AdhocMode == ADHOC_11A) || (pAd->PortCfg.AdhocMode == ADHOC_11ABG_MIXED))		{			//			// Only RFIC_5226, RFIC_5225 suport 11a			//			if ((Antenna.field.RfIcType == RFIC_2528) || (Antenna.field.RfIcType == RFIC_2527))				pAd->PortCfg.AdhocMode = ADHOC_11BG_MIXED;		}    }	// Read Tx power value for all 14 channels	// Value from 1 - 0x7f. Default value is 24.	// 0. 11b/g	// Power value 0xFA (-6) ~ 0x24 (36)	RTUSBReadEEPROM(pAd, EEPROM_G_TX_PWR_OFFSET,					ChannelTxPower, 2 * NUM_EEPROM_TX_G_PARMS);	for (i = 0; i < 2 * NUM_EEPROM_TX_G_PARMS; i++)	{		if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6))			pAd->TxPower[i].Power = 24;		else			pAd->TxPower[i].Power = ChannelTxPower[i];		DBGPRINT(RT_DEBUG_INFO, "Tx power for channel %d : 0x%02x\n",				pAd->TxPower[i].Channel, (UCHAR)(pAd->TxPower[i].Power));	}	// 1. UNI 36 - 64, HipperLAN 2 100 - 140, UNI 140 - 165	// Power value 0xFA (-6) ~ 0x24 (36)	RTUSBReadEEPROM(pAd, EEPROM_A_TX_PWR_OFFSET,					ChannelTxPower, MAX_NUM_OF_A_CHANNELS);	for (i = 0; i < MAX_NUM_OF_A_CHANNELS; i++)	{		if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6))			pAd->TxPower[i + 14].Power = 24;		else			pAd->TxPower[i + 14].Power = ChannelTxPower[i];		DBGPRINT(RT_DEBUG_INFO, "Tx power for channel %d : 0x%02x\n",				pAd->TxPower[i + 14].Channel,				(UCHAR)(pAd->TxPower[i + 14].Power));	}	//	// we must skip frist value, so we get TxPower as ChannelTxPower[i + 1];	// because the TxPower was stored from 0x7D, but we need to read EEPROM	// from 0x7C. (Word alignment)	//	// for J52, 34/38/42/46	RTUSBReadEEPROM(pAd, EEPROM_J52_TX_PWR_OFFSET,					ChannelTxPower, 6); //must Read even valuse	for (i = 0; i < 4; i++)	{		ASSERT(pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Channel == 34 + i * 4);		if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6))			pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power = 24;		else			pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power = ChannelTxPower[i + 1];		DBGPRINT(RT_DEBUG_INFO, "Tx power for channel %d : 0x%02x\n",				pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Channel,				(UCHAR)pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power);	}	// Read TSSI reference and TSSI boundary for temperature compensation.	// 0. 11b/g	{		RTUSBReadEEPROM(pAd, EEPROM_BG_TSSI_CALIBRAION, ChannelTxPower, 10);		pAd->TssiMinusBoundaryG[4] = ChannelTxPower[0];		pAd->TssiMinusBoundaryG[3] = ChannelTxPower[1];		pAd->TssiMinusBoundaryG[2] = ChannelTxPower[2];		pAd->TssiMinusBoundaryG[1] = ChannelTxPower[3];		pAd->TssiPlusBoundaryG[1] = ChannelTxPower[4];		pAd->TssiPlusBoundaryG[2] = ChannelTxPower[5];		pAd->TssiPlusBoundaryG[3] = ChannelTxPower[6];		pAd->TssiPlusBoundaryG[4] = ChannelTxPower[7];		pAd->TssiRefG	= ChannelTxPower[8];		pAd->TxAgcStepG = ChannelTxPower[9];		pAd->TxAgcCompensateG = 0;		pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;		pAd->TssiPlusBoundaryG[0]  = pAd->TssiRefG;		// Disable TxAgc if the based value is not right		if (pAd->TssiRefG == 0xff)			pAd->bAutoTxAgcG = FALSE;		DBGPRINT(RT_DEBUG_INFO,"E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",			pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3],			pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],			pAd->TssiRefG,			pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2],			pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],			pAd->TxAgcStepG, pAd->bAutoTxAgcG);	}	// 1. 11a	{		RTUSBReadEEPROM(pAd, EEPROM_A_TSSI_CALIBRAION, ChannelTxPower, 10);		pAd->TssiMinusBoundaryA[4] = ChannelTxPower[0];		pAd->TssiMinusBoundaryA[3] = ChannelTxPower[1];		pAd->TssiMinusBoundaryA[2] = ChannelTxPower[2];		pAd->TssiMinusBoundaryA[1] = ChannelTxPower[3];		pAd->TssiPlusBoundaryA[1] = ChannelTxPower[4];		pAd->TssiPlusBoundaryA[2] = ChannelTxPower[5];		pAd->TssiPlusBoundaryA[3] = ChannelTxPower[6];		pAd->TssiPlusBoundaryA[4] = ChannelTxPower[7];		pAd->TssiRefA	= ChannelTxPower[8];		pAd->TxAgcStepA = ChannelTxPower[9];		pAd->TxAgcCompensateA = 0;		pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;		pAd->TssiPlusBoundaryA[0]  = pAd->TssiRefA;		// Disable TxAgc if the based value is not right		if (pAd->TssiRefA == 0xff)			pAd->bAutoTxAgcA = FALSE;		DBGPRINT(RT_DEBUG_INFO,"E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",			pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3],			pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],			pAd->TssiRefA,			pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2],			pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],			pAd->TxAgcStepA, pAd->bAutoTxAgcA);	}	pAd->BbpRssiToDbmDelta = 0x79;	RTUSBReadEEPROM(pAd, EEPROM_FREQ_OFFSET, (PUCHAR) &value, 2);	value = le16_to_cpu(value);	DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_FREQ_OFFSET]=0x%04x\n", value);	if ((value & 0xFF00) == 0xFF00)	{		pAd->RFProgSeq = 0;	}	else	{		pAd->RFProgSeq = (value & 0x0300) >> 8;	// bit 8,9	}	value &= 0x00FF;	if (value != 0x00FF)		pAd->RfFreqOffset = (ULONG) value;	else		pAd->RfFreqOffset = 0;	DBGPRINT(RT_DEBUG_TRACE, "E2PROM: RF freq offset=0x%x\n", pAd->RfFreqOffset);	//CountryRegion byte offset = 0x25	value = pAd->EEPROMDefaultValue[2] >> 8;	// n.b. already flipped - bb	value2 = pAd->EEPROMDefaultValue[2] & 0x00FF;    if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))	{		pAd->PortCfg.CountryRegion = ((UCHAR) value) | 0x80;		pAd->PortCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;	}	//	// Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.	// The valid value are (-10 ~ 10)	//	RTUSBReadEEPROM(pAd, EEPROM_RSSI_BG_OFFSET, (PUCHAR) &value, 2);	value = le16_to_cpu(value);	DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_RSSI_BG_OFFSET]=0x%04x\n", value);	pAd->BGRssiOffset1 = value & 0x00ff;	pAd->BGRssiOffset2 = (value >> 8);	// Validate 11b/g RSSI_1 offset.	if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))		pAd->BGRssiOffset1 = 0;	// Validate 11b/g RSSI_2 offset.	if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))		pAd->BGRssiOffset2 = 0;	RTUSBReadEEPROM(pAd, EEPROM_RSSI_A_OFFSET, (PUCHAR) &value, 2);	value = le16_to_cpu(value);	DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_RSSI_A_OFFSET]=0x%04x\n", value);	pAd->ARssiOffset1 = value & 0x00ff;	pAd->ARssiOffset2 = (value >> 8);	// Validate 11a RSSI_1 offset.	if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))		pAd->ARssiOffset1 = 0;	//Validate 11a RSSI_2 offset.	if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))		pAd->ARssiOffset2 = 0;	//	// Get LED Setting.	//	RTUSBReadEEPROM(pAd, EEPROM_LED_OFFSET, (PUCHAR)&LedSetting.word, 2);	DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_LED_OFFSET]=0x%04x\n",			LedSetting.word);	LedSetting.word = le16_to_cpu(LedSetting.word);	if (LedSetting.word == 0xFFFF)	{		//		// Set it to Default.		//		LedSetting.field.PolarityRDY_G = 0;   // Active High.		LedSetting.field.PolarityRDY_A = 0;   // Active High.		LedSetting.field.PolarityACT = 0;	 // Active High.		LedSetting.field.PolarityGPIO_0 = 0; // Active High.		LedSetting.field.PolarityGPIO_1 = 0; // Active High.		LedSetting.field.PolarityGPIO_2 = 0; // Active High.		LedSetting.field.PolarityGPIO_3 = 0; // Active High.		LedSetting.field.PolarityGPIO_4 = 0; // Active High.		LedSetting.field.LedMode = LED_MODE_DEFAULT;	}	pAd->LedCntl.word = 0;	pAd->LedCntl.field.LedMode = LedSetting.field.LedMode;	pAd->LedCntl.field.PolarityRDY_G = LedSetting.field.PolarityRDY_G;	pAd->LedCntl.field.PolarityRDY_A = LedSetting.field.PolarityRDY_A;	pAd->LedCntl.field.PolarityACT = LedSetting.field.PolarityACT;	pAd->LedCntl.field.PolarityGPIO_0 = LedSetting.field.PolarityGPIO_0;	pAd->LedCntl.field.PolarityGPIO_1 = LedSetting.field.PolarityGPIO_1;	pAd->LedCntl.field.PolarityGPIO_2 = LedSetting.field.PolarityGPIO_2;	pAd->LedCntl.field.PolarityGPIO_3 = LedSetting.field.PolarityGPIO_3;	pAd->LedCntl.field.PolarityGPIO_4 = LedSetting.field.PolarityGPIO_4;	RTUSBReadEEPROM(pAd, EEPROM_TXPOWER_DELTA_OFFSET, (PUCHAR)&value, 2);	value = le16_to_cpu(value);	DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_TXPOWER_DELTA_OFFSET]=0x%04x\n", value);	value = value & 0x00ff;	if (value != 0xff)	{		pAd->TxPowerDeltaConfig.value = (UCHAR) value;		if (pAd->TxPowerDeltaConfig.field.DeltaValue > 0x04)			pAd->TxPowerDeltaConfig.field.DeltaValue = 0x04;	}	else		pAd->TxPowerDeltaConfig.field.TxPowerEnable = FALSE;	DBGPRINT(RT_DEBUG_TRACE, "<-- NICReadEEPROMParameters\n");}/*	========================================================================	Routine Description:		Set default value from EEPROM	Arguments:		Adapter						Pointer to our adapter	Return Value:		None	Note:	========================================================================*/VOID NICInitAsicFromEEPROM(	IN	PRTMP_ADAPTER	pAd){	ULONG					data;	USHORT					i;	ULONG					MiscMode;	EEPROM_ANTENNA_STRUC	Antenna;	EEPROM_NIC_CONFIG2_STRUC	NicConfig2;	DBGPRINT(RT_DEBUG_TRACE, "--> NICInitAsicFromEEPROM\n");	for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)	{		UCHAR BbpRegIdx, BbpValue;		if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))		{			BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);			BbpValue  = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);			RTUSBWriteBBPRegister(pAd, BbpRegIdx, BbpValue);		}	}	Antenna.word = pAd->EEPROMDefaultValue[0];	if (Antenna.word == 0xFFFF)	{		Antenna.word = 0;		Antenna.field.RfIcType = RFIC_5226;		Antenna.field.HardwareRadioControl = 0; 	// no hardware control		Antenna.field.DynamicTxAgcControl = 0;		Antenna.field.FrameType = 0;		Antenna.field.RxDefaultAntenna = 2; 		// Ant-B		Antenna.field.TxDefaultAntenna = 2; 		// Ant-B		Antenna.field.NumOfAntenna = 2;		DBGPRINT(RT_DEBUG_WARN, "E2PROM error, hard code as 0x%04x\n", Antenna.word);	}	pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;	DBGPRINT(RT_DEBUG_WARN, "pAd->RfIcType = %d\n", pAd->RfIcType);	//	// For RFIC RFIC_5225 & RFIC_2527	// Must enable RF RPI mode on PHY_CSR1 bit 16.	//	if ((pAd->RfIcType == RFIC_5225) || (pAd->RfIcType == RFIC_2527))	{		RTUSBReadMACRegister(pAd, PHY_CSR1, &MiscMode);		MiscMode |= 0x10000;		RTUSBWriteMACRegister(pAd, PHY_CSR1, MiscMode);	}	// Save the antenna for future use	pAd->Antenna.word = Antenna.word;	// Read Hardware controlled Radio state enable bit	if (Antenna.field.HardwareRadioControl == 1)	{		pAd->PortCfg.bHardwareRadio = TRUE;		// Read GPIO pin7 as Hardware controlled radio state		RTUSBReadMACRegister(pAd, MAC_CSR13, &data);		//		// The GPIO pin7 default is 1:Pull-High, means HW Radio Enable.		// When the value is 0, means HW Radio disable.		//		if ((data & 0x80) == 0)		{			pAd->PortCfg.bHwRadio = FALSE;			// Update extra information to link is up			pAd->ExtraInfo = HW_RADIO_OFF;		}	}	else		pAd->PortCfg.bHardwareRadio = FALSE;	pAd->PortCfg.bRadio = pAd->PortCfg.bSwRadio && pAd->PortCfg.bHwRadio;	if (pAd->PortCfg.bRadio == FALSE)	{		RTUSBWriteMACRegister(pAd, MAC_CSR10, 0x00001818);		RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);		RTMPSetLED(pAd, LED_RADIO_OFF);	}	else	{		RTMPSetLED(pAd, LED_RADIO_ON);	}	NicConfig2.word = pAd->EEPROMDefaultValue[1];	if (NicConfig2.word == 0xffff)	{		NicConfig2.word = 0;	}	// Save the antenna for future use	pAd->NicConfig2.word = NicConfig2.word;	DBGPRINT(RT_DEBUG_TRACE, "Use Hw Radio Control Pin=%d; if used Pin=%d;\n",		pAd->PortCfg.bHardwareRadio, pAd->PortCfg.bHardwareRadio);	DBGPRINT(RT_DEBUG_TRACE, "RFIC=%d, LED mode=%d\n", pAd->RfIcType, pAd->LedCntl.field.LedMode);	pAd->PortCfg.BandState = UNKNOWN_BAND;	DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitAsicFromEEPROM\n");}/*	========================================================================	Routine Description:		Initialize NIC hardware	Arguments:		Adapter						Pointer to our adapter	Return Value:		None	Note:	========================================================================*/NDIS_STATUS	NICInitializeAsic(	IN	PRTMP_ADAPTER	pAd){	ULONG			Index, Counter;	UCHAR			Value = 0xff;	ULONG			Version;	MAC_CSR12_STRUC	MacCsr12;	RTUSBReadMACRegister(pAd, MAC_CSR0, &Version);	DBGPRINT(RT_DEBUG_TRACE, "--> NICInitializeAsic ASIC Ver 0x%x\n", Version);	// Initialize MAC register to default value	for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)	{		RTUSBWriteMACRegister(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);	}	// Set Host ready before kicking Rx	RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x3);	RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x0);	//	// Before program BBP, we need to wait BBP/RF get wake up.	//	Index = 0;	do	{		RTUSBReadMACRegister(pAd, MAC_CSR12, &MacCsr12.word);		if (MacCsr12.field.BbpRfStatus == 1)			break;		RTUSBWriteMACRegister(pAd, MAC_CSR12, 0x4); //Force wake up.		RTMPusecDelay(1000);	} while (Index++ < 1000);	// Read BBP register, make sure BBP is up and running before write new data	Index = 0;	do	{		RTUSBReadBBPRegister(pAd, BBP_R0, &Value);		DBGPRINT(RT_DEBUG_TRACE, "BBP version = %d\n", Value);	} while ((++Index < 100) && ((Value == 0xff) || (Value == 0x00)));	// Initialize BBP register to default value	for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)	{		RTUSBWriteBBPRegister(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);	}	// Clear raw counters	RTUSBReadMACRegister(pAd, STA_CSR0, &Counter);	RTUSBReadMACRegister(pAd, STA_CSR1, &Counter);	RTUSBReadMACRegister(pAd, STA_CSR2, &Counter);	// assert HOST ready bit	RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x4);

⌨️ 快捷键说明

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