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

📄 ar5416_reset.c.svn-base

📁 最新之atheros芯片driver source code, 基于linux操作系统,內含atheros芯片HAL全部代码
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
         * is found in this channel.         */        OS_REG_CLR_BIT(ah, AR_PHY_FORCE_CLKEN_CCK, AR_PHY_FORCE_CLKEN_CCK_MRC_MUX);    }    bin = bb_spur * 320;    tmp = OS_REG_READ(ah, AR_PHY_TIMING_CTRL4_CHAIN(0));    newVal = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI |        AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER |        AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK |        AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK);    OS_REG_WRITE(ah, AR_PHY_TIMING_CTRL4_CHAIN(0), newVal);    newVal = (AR_PHY_SPUR_REG_MASK_RATE_CNTL |        AR_PHY_SPUR_REG_ENABLE_MASK_PPM |        AR_PHY_SPUR_REG_MASK_RATE_SELECT |        AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI |        SM(SPUR_RSSI_THRESH, AR_PHY_SPUR_REG_SPUR_RSSI_THRESH));    OS_REG_WRITE(ah, AR_PHY_SPUR_REG, newVal);    /* Pick control or extn channel to cancel the spur */    if (IS_CHAN_HT40(ichan)) {        if (bb_spur < 0) {            spur_subchannel_sd = 1;            bb_spur_off = bb_spur + 10;        } else {            spur_subchannel_sd = 0;            bb_spur_off = bb_spur - 10;        }    } else {        spur_subchannel_sd = 0;        bb_spur_off = bb_spur;    }    /*     * spur_delta_phase = bb_spur/40 * 2**21 for static ht20,     * /80 for dyn2040.     */    if (IS_CHAN_HT40(ichan))        spur_delta_phase = ((bb_spur * 262144) / 10) & AR_PHY_TIMING11_SPUR_DELTA_PHASE;        else        spur_delta_phase = ((bb_spur * 524288) / 10) & AR_PHY_TIMING11_SPUR_DELTA_PHASE;    /*     * in 11A mode the denominator of spur_freq_sd should be 40 and     * it should be 44 in 11G     */    denominator = IS_CHAN_2GHZ(ichan) ? 44 : 40;    spur_freq_sd = ((bb_spur_off * 2048) / denominator) & 0x3ff;    newVal = (AR_PHY_TIMING11_USE_SPUR_IN_AGC |        SM(spur_freq_sd, AR_PHY_TIMING11_SPUR_FREQ_SD) |        SM(spur_delta_phase, AR_PHY_TIMING11_SPUR_DELTA_PHASE));    OS_REG_WRITE(ah, AR_PHY_TIMING11, newVal);    /* Choose to cancel between control and extension channels */    newVal = spur_subchannel_sd << AR_PHY_SFCORR_SPUR_SUBCHNL_SD_S;    OS_REG_WRITE(ah, AR_PHY_SFCORR_EXT, newVal);    /*     * ============================================     * Set Pilot and Channel Masks     *     * pilot mask 1 [31:0] = +6..-26, no 0 bin     * pilot mask 2 [19:0] = +26..+7     *     * channel mask 1 [31:0] = +6..-26, no 0 bin     * channel mask 2 [19:0] = +26..+7     */    cur_bin = -6000;    upper = bin + 100;    lower = bin - 100;    for (i = 0; i < 4; i++) {        int pilot_mask = 0;        int chan_mask  = 0;        int bp         = 0;        for (bp = 0; bp < 30; bp++) {            if ((cur_bin > lower) && (cur_bin < upper)) {                pilot_mask = pilot_mask | 0x1 << bp;                chan_mask  = chan_mask | 0x1 << bp;            }            cur_bin += 100;        }        cur_bin += inc[i];        OS_REG_WRITE(ah, pilot_mask_reg[i], pilot_mask);        OS_REG_WRITE(ah, chan_mask_reg[i], chan_mask);    }    /* =================================================     * viterbi mask 1 based on channel magnitude     * four levels 0-3     *  - mask (-27 to 27) (reg 64,0x9900 to 67,0x990c)     *      [1 2 2 1] for -9.6 or [1 2 1] for +16     *  - enable_mask_ppm, all bins move with freq     *     *  - mask_select,    8 bits for rates (reg 67,0x990c)     *  - mask_rate_cntl, 8 bits for rates (reg 67,0x990c)     *      choose which mask to use mask or mask2     */    /*     * viterbi mask 2  2nd set for per data rate puncturing     * four levels 0-3     *  - mask_select, 8 bits for rates (reg 67)     *  - mask (-27 to 27) (reg 98,0x9988 to 101,0x9994)     *      [1 2 2 1] for -9.6 or [1 2 1] for +16     */    cur_vit_mask = 6100;    upper        = bin + 120;    lower        = bin - 120;    for (i = 0; i < 123; i++) {        if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) {            if ((abs(cur_vit_mask - bin)) < 75) {                mask_amt = 1;            } else {                mask_amt = 0;            }            if (cur_vit_mask < 0) {                mask_m[abs(cur_vit_mask / 100)] = mask_amt;            } else {                mask_p[cur_vit_mask / 100] = mask_amt;            }        }        cur_vit_mask -= 100;    }    tmp_mask = (mask_m[46] << 30) | (mask_m[47] << 28)          | (mask_m[48] << 26) | (mask_m[49] << 24)          | (mask_m[50] << 22) | (mask_m[51] << 20)          | (mask_m[52] << 18) | (mask_m[53] << 16)          | (mask_m[54] << 14) | (mask_m[55] << 12)          | (mask_m[56] << 10) | (mask_m[57] <<  8)          | (mask_m[58] <<  6) | (mask_m[59] <<  4)          | (mask_m[60] <<  2) | (mask_m[61] <<  0);    OS_REG_WRITE(ah, AR_PHY_BIN_MASK_1, tmp_mask);    OS_REG_WRITE(ah, AR_PHY_VIT_MASK2_M_46_61, tmp_mask);    tmp_mask =             (mask_m[31] << 28)          | (mask_m[32] << 26) | (mask_m[33] << 24)          | (mask_m[34] << 22) | (mask_m[35] << 20)          | (mask_m[36] << 18) | (mask_m[37] << 16)          | (mask_m[48] << 14) | (mask_m[39] << 12)          | (mask_m[40] << 10) | (mask_m[41] <<  8)          | (mask_m[42] <<  6) | (mask_m[43] <<  4)          | (mask_m[44] <<  2) | (mask_m[45] <<  0);    OS_REG_WRITE(ah, AR_PHY_BIN_MASK_2, tmp_mask);    OS_REG_WRITE(ah, AR_PHY_MASK2_M_31_45, tmp_mask);    tmp_mask = (mask_m[16] << 30) | (mask_m[16] << 28)          | (mask_m[18] << 26) | (mask_m[18] << 24)          | (mask_m[20] << 22) | (mask_m[20] << 20)          | (mask_m[22] << 18) | (mask_m[22] << 16)          | (mask_m[24] << 14) | (mask_m[24] << 12)          | (mask_m[25] << 10) | (mask_m[26] <<  8)          | (mask_m[27] <<  6) | (mask_m[28] <<  4)          | (mask_m[29] <<  2) | (mask_m[30] <<  0);    OS_REG_WRITE(ah, AR_PHY_BIN_MASK_3, tmp_mask);    OS_REG_WRITE(ah, AR_PHY_MASK2_M_16_30, tmp_mask);    tmp_mask = (mask_m[ 0] << 30) | (mask_m[ 1] << 28)          | (mask_m[ 2] << 26) | (mask_m[ 3] << 24)          | (mask_m[ 4] << 22) | (mask_m[ 5] << 20)          | (mask_m[ 6] << 18) | (mask_m[ 7] << 16)          | (mask_m[ 8] << 14) | (mask_m[ 9] << 12)          | (mask_m[10] << 10) | (mask_m[11] <<  8)          | (mask_m[12] <<  6) | (mask_m[13] <<  4)          | (mask_m[14] <<  2) | (mask_m[15] <<  0);    OS_REG_WRITE(ah, AR_PHY_MASK_CTL, tmp_mask);    OS_REG_WRITE(ah, AR_PHY_MASK2_M_00_15, tmp_mask);    tmp_mask =             (mask_p[15] << 28)          | (mask_p[14] << 26) | (mask_p[13] << 24)          | (mask_p[12] << 22) | (mask_p[11] << 20)          | (mask_p[10] << 18) | (mask_p[ 9] << 16)          | (mask_p[ 8] << 14) | (mask_p[ 7] << 12)          | (mask_p[ 6] << 10) | (mask_p[ 5] <<  8)          | (mask_p[ 4] <<  6) | (mask_p[ 3] <<  4)          | (mask_p[ 2] <<  2) | (mask_p[ 1] <<  0);    OS_REG_WRITE(ah, AR_PHY_BIN_MASK2_1, tmp_mask);    OS_REG_WRITE(ah, AR_PHY_MASK2_P_15_01, tmp_mask);    tmp_mask =             (mask_p[30] << 28)          | (mask_p[29] << 26) | (mask_p[28] << 24)          | (mask_p[27] << 22) | (mask_p[26] << 20)          | (mask_p[25] << 18) | (mask_p[24] << 16)          | (mask_p[23] << 14) | (mask_p[22] << 12)          | (mask_p[21] << 10) | (mask_p[20] <<  8)          | (mask_p[19] <<  6) | (mask_p[18] <<  4)          | (mask_p[17] <<  2) | (mask_p[16] <<  0);    OS_REG_WRITE(ah, AR_PHY_BIN_MASK2_2, tmp_mask);    OS_REG_WRITE(ah, AR_PHY_MASK2_P_30_16, tmp_mask);    tmp_mask =             (mask_p[45] << 28)          | (mask_p[44] << 26) | (mask_p[43] << 24)          | (mask_p[42] << 22) | (mask_p[41] << 20)          | (mask_p[40] << 18) | (mask_p[39] << 16)          | (mask_p[38] << 14) | (mask_p[37] << 12)          | (mask_p[36] << 10) | (mask_p[35] <<  8)          | (mask_p[34] <<  6) | (mask_p[33] <<  4)          | (mask_p[32] <<  2) | (mask_p[31] <<  0);    OS_REG_WRITE(ah, AR_PHY_BIN_MASK2_3, tmp_mask);    OS_REG_WRITE(ah, AR_PHY_MASK2_P_45_31, tmp_mask);    tmp_mask = (mask_p[61] << 30) | (mask_p[60] << 28)          | (mask_p[59] << 26) | (mask_p[58] << 24)          | (mask_p[57] << 22) | (mask_p[56] << 20)          | (mask_p[55] << 18) | (mask_p[54] << 16)          | (mask_p[53] << 14) | (mask_p[52] << 12)          | (mask_p[51] << 10) | (mask_p[50] <<  8)          | (mask_p[49] <<  6) | (mask_p[48] <<  4)          | (mask_p[47] <<  2) | (mask_p[46] <<  0);    OS_REG_WRITE(ah, AR_PHY_BIN_MASK2_4, tmp_mask);    OS_REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask);}#endif /* AH_SUPPORT_AR9280 *//* * Set a limit on the overall output power.  Used for dynamic * transmit power control and the like. * * NB: limit is in units of 0.5 dbM. */HAL_BOOLar5416SetTxPowerLimit(struct ath_hal *ah, uint32_t limit){	uint16_t dummyXpdGains[2];	AH_PRIVATE(ah)->ah_powerLimit = AH_MIN(limit, MAX_RATE_POWER);	return ar5416SetTransmitPower(ah, AH_PRIVATE(ah)->ah_curchan,			dummyXpdGains);}HAL_BOOLar5416GetChipPowerLimits(struct ath_hal *ah, HAL_CHANNEL *chans, uint32_t nchans){	struct ath_hal_5212 *ahp = AH5212(ah);	int16_t minPower, maxPower;	HAL_CHANNEL *chan;	int i;	/*	 * Get Pier table max and min powers.	 */	for (i = 0; i < nchans; i++) {		chan = &chans[i];		if (ahp->ah_rfHal->getChannelMaxMinPower(ah, chan, &maxPower, &minPower)) {			/* NB: rf code returns 1/4 dBm units, convert */			chan->maxTxPower = maxPower / 2;			chan->minTxPower = minPower / 2;		} else {			HALDEBUG(ah, HAL_DEBUG_ANY,			    "%s: no min/max power for %u/0x%x\n",			    __func__, chan->channel, chan->channelFlags);			chan->maxTxPower = AR5416_MAX_RATE_POWER;			chan->minTxPower = 0;		}	}#ifdef AH_DEBUG	for (i=0; i<nchans; i++) {		HALDEBUG(ah, HAL_DEBUG_RESET,		    "Chan %d: MaxPow = %d MinPow = %d\n",		    chans[i].channel,chans[i].maxTxPower, chans[i].minTxPower);	}#endif	return AH_TRUE;}/* XXX gag, this is sick */typedef enum Ar5416_Rates {	rate6mb,  rate9mb,  rate12mb, rate18mb,	rate24mb, rate36mb, rate48mb, rate54mb,	rate1l,   rate2l,   rate2s,   rate5_5l,	rate5_5s, rate11l,  rate11s,  rateXr,	rateHt20_0, rateHt20_1, rateHt20_2, rateHt20_3,	rateHt20_4, rateHt20_5, rateHt20_6, rateHt20_7,	rateHt40_0, rateHt40_1, rateHt40_2, rateHt40_3,	rateHt40_4, rateHt40_5, rateHt40_6, rateHt40_7,	rateDupCck, rateDupOfdm, rateExtCck, rateExtOfdm,	Ar5416RateSize} AR5416_RATES;/************************************************************** * ar5416SetTransmitPower * * Set the transmit power in the baseband for the given * operating channel and mode. */static HAL_BOOLar5416SetTransmitPower(struct ath_hal *ah, HAL_CHANNEL_INTERNAL *chan, uint16_t *rfXpdGain){#define POW_SM(_r, _s)     (((_r) & 0x3f) << (_s))#define N(a)            (sizeof (a) / sizeof (a[0]))    MODAL_EEP_HEADER	*pModal;    struct ath_hal_5212 *ahp = AH5212(ah);    int16_t		ratesArray[Ar5416RateSize];    int16_t		txPowerIndexOffset = 0;    uint8_t		ht40PowerIncForPdadc = 2;	    int			i;        uint16_t		cfgCtl;    uint16_t		powerLimit;    uint16_t		twiceAntennaReduction;    uint16_t		twiceMaxRegulatoryPower;    int16_t		maxPower;    HAL_EEPROM_v14 *ee = AH_PRIVATE(ah)->ah_eeprom;    struct ar5416eeprom	*pEepData = &ee->ee_base;    HALASSERT(AH_PRIVATE(ah)->ah_eeversion >= AR_EEPROM_VER14_1);    /* Setup info for the actual eeprom */    ath_hal_memzero(ratesArray, sizeof(ratesArray));    cfgCtl = ath_hal_getctl(ah, (HAL_CHANNEL *)chan);    powerLimit = chan->maxRegTxPower * 2;    twiceAntennaReduction = chan->antennaMax;    twiceMaxRegulatoryPower = AH_MIN(MAX_RATE_POWER, AH_PRIVATE(ah)->ah_powerLimit);     pModal = &pEepData->modalHeader[IS_CHAN_2GHZ(chan)];    HALDEBUG(ah, HAL_DEBUG_RESET, "%s Channel=%u CfgCtl=%u\n",	__func__,chan->channel, cfgCtl );            if (IS_EEP_MINOR_V2(ah)) {        ht40PowerIncForPdadc = pModal->ht40PowerIncForPdadc;    }     if (!ar5416SetPowerPerRateTable(ah, pEepData,  chan,                                    &ratesArray[0],cfgCtl,                                    twiceAntennaReduction,				    twiceMaxRegulatoryPower, powerLimit)) {        HALDEBUG(ah, HAL_DEBUG_ANY,	    "%s: unable to set tx power per rate table\n", __func__);        return AH_FALSE;    }    if (!ar5416SetPowerCalTable(ah,  pEepData, chan, &txPowerIndexOffset)) {        HALDEBUG(ah, HAL_DEBUG_ANY, "%s: unable to set power table\n",	    __func__);        return AH_FALSE;    }      maxPower = AH_MAX(ratesArray[rate6mb], ratesArray[rateHt20_0]);    if (IS_CHAN_2GHZ(chan)) {        maxPower = AH_MAX(maxPower, ratesArray[rate1l]);    }    if (IS_CHAN_HT40(chan)) {        maxPower = AH_MAX(maxPower, ratesArray[rateHt40_0]);    }    ahp->ah_tx6PowerInHalfDbm = maxPower;       AH_PRIVATE(ah)->ah_maxPowerLevel = maxPower;    ahp->ah_txPowerIndexOffset = txPowerIndexOffset;    /*     * txPowerIndexOffset is set by the SetPowerTable() call -     *  adjust the rate table (0 offset if rates EEPROM not loaded)     */    for (i = 0; i < N(ratesArray); i++) {        ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]);        if (ratesArray[i] > AR5416_MAX_RATE_POWER)            ratesArray[i] = AR5416_MAX_RATE_POWER;    }#ifdef AH_EEPROM_DUMP    ar5416PrintPowerPerRate(ah, ratesArray);#endif    /* Write the OFDM power per rate set */    OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE1,        POW_SM(ratesArray[rate18mb], 24)          | POW_SM(ratesArray[rate12mb], 16)          | POW_SM(ratesArray[rate9mb], 8)          | POW_SM(ratesArray[rate6mb], 0)    );    OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE2,        POW_SM(ratesArray[rate54mb], 24)          | POW_SM(ratesArray[rate48mb], 16)          | POW_SM(ratesArray[rate36mb], 8)          | POW_SM(ratesArray[rate24mb], 0)    );    if (IS_CHAN_2GHZ(chan)) {        /* Write the CCK power per rate set */        OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE3,            POW_SM(ratesArray[rate2s], 24)              | POW_SM(ratesArray[rate2l],  16)              | POW_SM(ratesArray[rateXr],  8) /* XR target power */              | POW_SM(ratesArray[rate1l],   0)        );        OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE4,            POW_SM(ratesArray[rate11s], 24)              | POW_SM(ratesArray[rate11l], 16)              | POW_SM(ratesArray[rate5_5s], 8)

⌨️ 快捷键说明

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