rtmp_init.c

来自「Ralink RT61 SoftAP Driver source code. 」· C语言 代码 · 共 1,988 行 · 第 1/5 页

C
1,988
字号
		pAd->TssiPlusBoundaryG[3] = Power.field.Byte0;
		pAd->TssiPlusBoundaryG[4] = Power.field.Byte1;
        Power.word = RTMP_EEPROM_READ16(pAd, 0x5c);
        pAd->TssiRefG   = Power.field.Byte0;
        pAd->TxAgcStepG = Power.field.Byte1;    
        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_TRACE,"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
	{
		Power.word = RTMP_EEPROM_READ16(pAd, 0x90);
		pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
		pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
		Power.word = RTMP_EEPROM_READ16(pAd, 0x92);
		pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
		pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
		Power.word = RTMP_EEPROM_READ16(pAd, 0x94);
		pAd->TssiPlusBoundaryA[1] = Power.field.Byte0;
		pAd->TssiPlusBoundaryA[2] = Power.field.Byte1;
		Power.word = RTMP_EEPROM_READ16(pAd, 0x96);
		pAd->TssiPlusBoundaryA[3] = Power.field.Byte0;
		pAd->TssiPlusBoundaryA[4] = Power.field.Byte1;
        Power.word = RTMP_EEPROM_READ16(pAd, 0x98);
        pAd->TssiRefA   = Power.field.Byte0;
        pAd->TxAgcStepA = Power.field.Byte1;    
        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_TRACE,"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;
	
	// Read frequency offset and RF programming sequence setting for RT5225
    value = RTMP_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET);
	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, RF programming seq=%d\n", pAd->RfFreqOffset,pAd->RFProgSeq);

	//CountryRegion byte offset = 0x25
	value = pAd->EEPROMDefaultValue[2] >> 8;
	value2 = pAd->EEPROMDefaultValue[2] & 0x00FF;
	if ((value <= 6) && (value2 <= 7))
	{
		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) 
	// 
	value = RTMP_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET);
	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;
		
	value = RTMP_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET);
	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.
	//
	LedSetting.word = RTMP_EEPROM_READ16(pAd, EEPROM_LED_OFFSET);
	if (LedSetting.word == 0xFFFF)
	{
		//
		// Set it to Default.
		//
		LedSetting.field.PolarityRDY_G = 1;   // Active High.
		LedSetting.field.PolarityRDY_A = 1;   // Active High.
		LedSetting.field.PolarityACT = 1;    // Active High.
		LedSetting.field.PolarityGPIO_0 = 1; // Active High.
		LedSetting.field.PolarityGPIO_1 = 1; // Active High.
		LedSetting.field.PolarityGPIO_2 = 1; // Active High.
		LedSetting.field.PolarityGPIO_3 = 1; // Active High.
		LedSetting.field.PolarityGPIO_4 = 1; // Active High.
		LedSetting.field.STALedMode = LED_MODE_DEFAULT;
		LedSetting.field.APLedMode = LED_MODE_DEFAULT;
	}
	pAd->LedCntl.word = 0;
	pAd->LedCntl.field.LedMode = LedSetting.field.APLedMode | 0x18;	// Offset 0x18 to let firmware know AP or STA
	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;

	// 
	value = RTMP_EEPROM_READ16(pAd, EEPROM_TX_POWER_DELTA);
	if ((value & 0x00FF) == 0xFF)
	{
		pAd->TxPowerDelta.word = 0;
//		RTMP_IO_WRITE32(pAd, TXRX_CSR3, 0x00858687);
	}
	else
	{
		pAd->TxPowerDelta.word = value;
//		RTMP_IO_WRITE32(pAd, TXRX_CSR3, 0xde858687);// Per-Packet per txpower
	}

	AModeGainValue = (value >> 8);
	if (AModeGainValue == 0xff)
	{
		pAd->AModeGainValue = 0x08;  //Default value set to 0x08
	}
	else
	{
		pAd->AModeGainValue = AModeGainValue;
	}

	DBGPRINT(RT_DEBUG_TRACE, "TxPowerDelta Config (Delta=%d, Sign=%d, Enable=%d)\n",
		pAd->TxPowerDelta.field.Delta, pAd->TxPowerDelta.field.Sign, pAd->TxPowerDelta.field.Enable);
	
	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)
{
	USHORT					i;
	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);
    	    RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
   		}
    }
    
	Antenna.word = pAd->EEPROMDefaultValue[0];

	if (Antenna.word == 0xFFFF)
	{
	    Antenna.word = 0;
        Antenna.field.RfIcType = RFIC_5225;
        Antenna.field.HardwareRadioControl = 0;     // no hardware control
        Antenna.field.DynamicTxAgcControl = 0;
        Antenna.field.RxDefaultAntenna = 2;         // Ant-B
        Antenna.field.TxDefaultAntenna = 2;         // Ant-B
        Antenna.field.NumOfAntenna = 2;
        DBGPRINT(RT_DEBUG_TRACE, "E2PROM, Antenna parameter error, hard code as 0x%04x\n", Antenna.word);
	}

    pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;

	// recovery invalid settings in EEPROM
	if (pAd->DefaultTxAntenna != (char)-1)
	{
		Antenna.field.RxDefaultAntenna = pAd->DefaultTxAntenna;
        Antenna.field.TxDefaultAntenna = pAd->DefaultTxAntenna;
	}
	
	// Save the antenna for future use
	pAd->Antenna.word = Antenna.word;
	
	NicConfig2.word = pAd->EEPROMDefaultValue[1];
	if (NicConfig2.word == 0xffff)
	{
		NicConfig2.word = 0;
	}
	// Save the antenna for future use
	pAd->NicConfig2.word = NicConfig2.word;

	// external LNA For 5G has different R17 base
	if (pAd->NicConfig2.field.ExternalLNAForA)
	{
		pAd->BbpTuning.R17LowerBoundA += pAd->AModeGainValue;
		pAd->BbpTuning.R17UpperBoundA += pAd->AModeGainValue;
	}
	// external LNA For 2.4G has different R17 base
	if (pAd->NicConfig2.field.ExternalLNAForG)
	{
	    pAd->BbpTuning.R17LowerBoundG += 0x10;
	    pAd->BbpTuning.R17UpperBoundG += 0x10;
	}

   	DBGPRINT(RT_DEBUG_TRACE, "RFIC=%d, LED mode=%d\n", pAd->RfIcType, pAd->LedCntl.field.LedMode);

	DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitAsicFromEEPROM\n");
}

NDIS_STATUS NICInitializeAdapter(
	IN PRTMP_ADAPTER   pAdapter)
{
	TX_RING_CSR0_STRUC TxCsr0;
	TX_RING_CSR1_STRUC TxCsr1;
	RX_RING_CSR_STRUC  RxCsr;
	ULONG			Value;
    NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;

	DBGPRINT(RT_DEBUG_TRACE, "--> NICInitializeAdapter\n");

    //
    // write all shared Ring's base address into ASIC
    //
    
    // Write AC_BK base address register
    Value = pAdapter->TxRing[QID_AC_BK].Cell[0].AllocPa;
    RTMP_IO_WRITE32(pAdapter, AC1_BASE_CSR, Value);
            
    // Write AC_BE base address register
    Value = pAdapter->TxRing[QID_AC_BE].Cell[0].AllocPa;
    RTMP_IO_WRITE32(pAdapter, AC0_BASE_CSR, Value);
            
    // Write AC_VI base address register
    Value = pAdapter->TxRing[QID_AC_VI].Cell[0].AllocPa;
    RTMP_IO_WRITE32(pAdapter, AC2_BASE_CSR, Value);
            
    // Write AC_VO base address register
    Value = pAdapter->TxRing[QID_AC_VO].Cell[0].AllocPa;
    RTMP_IO_WRITE32(pAdapter, AC3_BASE_CSR, Value);
            
    // Write HCCA base address register
    //  Value = NdisGetPhysicalAddressLow(pAdapter->TxRing[QID_HCCA].Cell[0].AllocPa);
    //  RTMP_IO_WRITE32(pAdapter, HCCA_BASE_CSR, Value);
            
    // Write MGMT_BASE_CSR register
    Value = pAdapter->MgmtRing.Cell[0].AllocPa;
    RTMP_IO_WRITE32(pAdapter, MGMT_BASE_CSR, Value);
            
    // Write RX_BASE_CSR register
    Value = pAdapter->RxRing.Cell[0].AllocPa;
    RTMP_IO_WRITE32(pAdapter, RX_BASE_CSR, Value);

    //
    // set each Ring's SIZE and DESCRIPTOR size into ASIC
    //
    
	// Write TX_RING_CSR0 register
	TxCsr0.word = 0;
	TxCsr0.field.Ac0Total = TX_RING_SIZE;
	TxCsr0.field.Ac1Total = TX_RING_SIZE;
	TxCsr0.field.Ac2Total = TX_RING_SIZE;
	TxCsr0.field.Ac3Total = TX_RING_SIZE;
	RTMP_IO_WRITE32(pAdapter, TX_RING_CSR0, TxCsr0.word);

	// Write TX_RING_CSR1 register
	TxCsr1.word = 0;
    TxCsr1.field.TxdSize = TXD_SIZE/4;
    TxCsr1.field.HccaTotal = TX_RING_SIZE;
    TxCsr1.field.MgmtTotal = MGMT_RING_SIZE;
	RTMP_IO_WRITE32(pAdapter, TX_RING_CSR1, TxCsr1.word);

	// Write RX_RING_CSR register
	RxCsr.word = 0;
	RxCsr.field.RxdSize = RXD_SIZE/4;
	RxCsr.field.RxRingTotal = RX_RING_SIZE;
	RxCsr.field.RxdWritebackSize = 4;
	RTMP_IO_WRITE32(pAdapter, RX_RING_CSR, RxCsr.word);

    //
    // Load shared memeory configuration to ASIC DMA block
    //

    // 0x342c, ASIC TX FIFO to host shared memory mapping
    RTMP_IO_WRITE32(pAdapter, TX_DMA_DST_CSR, 0x000000aa); 

    // ASIC load all TX ring's base address
    RTMP_IO_WRITE32(pAdapter, LOAD_TX_RING_CSR, 0x1f);

    // ASIC load RX ring's base address. still disable RX
    RTMP_IO_WRITE32(pAdapter, RX_CNTL_CSR, 0x00000002);
    
	// Initialze ASIC for TX & Rx operation
	NICInitializeAsic(pAdapter);

    // Load firmware
//  Status = NICLoadFirmware(pAdapter);
    
	DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitializeAdapter\n");
    return Status;
}

void    NICInitializeAsic(
	IN    PRTMP_ADAPTER   pAdapter)
{
	ULONG			Index, Counter;
	UCHAR			Value = 0xff;
	ULONG			MacCsr12;

	DBGPRINT(RT_DEBUG_TRACE, "--> NICInitializeAsic\n");

	// Initialize MAC register to default value
	for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)
	{
		RTMP_IO_WRITE32(pAdapter, MACRegTable[Index].Register, MACRegTable[Index].Value);
	}
	
	// Set Host ready before kicking Rx
//	RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x1); // reset MAC state machine, requested by Kevin 2003-2-11
	RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x3);
    RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x0);

    //
	// Before program BBP, we need to wait BBP/RF get wake up.
	//
	Index = 0;
	do
	{
		RTMP_IO_READ32(pAdapter, MAC_CSR12, &MacCsr12);

		if (MacCsr12 & 0x08)
			break;
		
		RTMPusecDelay(1000);
	} while (Index++ < 1000);

	// Read BBP register, make sure BBP is up and running before write new data
	Index = 0;
	do 
	{
		RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R0, &Value);
		DBGPRINT(RT_DEBUG_TRACE, "BBP version = %d\n", Value);
	} while ((++Index < 100) && ((Value == 0xff) || (Value == 0x00)));
    ASSERT(Index < 100);
    
	// Initialize BBP register to default value
	for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
	{
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
	}

	// Kick Rx

⌨️ 快捷键说明

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