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 + -
显示快捷键?