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

📄 ar2413.c.svn-base

📁 最新之atheros芯片driver source code, 基于linux操作系统,內含atheros芯片HAL全部代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
	uint16_t Vpd_step;	int16_t tmpVal ; 	uint32_t sizeCurrVpdTable, maxIndex, tgtIndex;	/* Get upper lower index */	GetLowerUpperIndex(channel, pRawDataset->pChannels,				 pRawDataset->numChannels, &(idxL), &(idxR));	for (ii = 0; ii < MAX_NUM_PDGAINS_PER_CHANNEL; ii++) {		jj = MAX_NUM_PDGAINS_PER_CHANNEL - ii - 1;		/* work backwards 'cause highest pdGain for lowest power */		numVpd = pRawDataset->pDataPerChannel[idxL].pDataPerPDGain[jj].numVpd;		if (numVpd > 0) {			pPdGainValues[numPdGainsUsed] = pRawDataset->pDataPerChannel[idxL].pDataPerPDGain[jj].pd_gain;			Pmin_t2[numPdGainsUsed] = pRawDataset->pDataPerChannel[idxL].pDataPerPDGain[jj].pwr_t4[0];			if (Pmin_t2[numPdGainsUsed] >pRawDataset->pDataPerChannel[idxR].pDataPerPDGain[jj].pwr_t4[0]) {				Pmin_t2[numPdGainsUsed] = pRawDataset->pDataPerChannel[idxR].pDataPerPDGain[jj].pwr_t4[0];			}			Pmin_t2[numPdGainsUsed] = (int16_t)				(Pmin_t2[numPdGainsUsed] / 2);			Pmax_t2[numPdGainsUsed] = pRawDataset->pDataPerChannel[idxL].pDataPerPDGain[jj].pwr_t4[numVpd-1];			if (Pmax_t2[numPdGainsUsed] > pRawDataset->pDataPerChannel[idxR].pDataPerPDGain[jj].pwr_t4[numVpd-1])				Pmax_t2[numPdGainsUsed] = 					pRawDataset->pDataPerChannel[idxR].pDataPerPDGain[jj].pwr_t4[numVpd-1];			Pmax_t2[numPdGainsUsed] = (int16_t)(Pmax_t2[numPdGainsUsed] / 2);			ar2413FillVpdTable(					   numPdGainsUsed, Pmin_t2[numPdGainsUsed], Pmax_t2[numPdGainsUsed], 					   &(pRawDataset->pDataPerChannel[idxL].pDataPerPDGain[jj].pwr_t4[0]), 					   &(pRawDataset->pDataPerChannel[idxL].pDataPerPDGain[jj].Vpd[0]), numVpd, VpdTable_L					   );			ar2413FillVpdTable(					   numPdGainsUsed, Pmin_t2[numPdGainsUsed], Pmax_t2[numPdGainsUsed], 					   &(pRawDataset->pDataPerChannel[idxR].pDataPerPDGain[jj].pwr_t4[0]),					   &(pRawDataset->pDataPerChannel[idxR].pDataPerPDGain[jj].Vpd[0]), numVpd, VpdTable_R					   );			for (kk = 0; kk < (uint16_t)(Pmax_t2[numPdGainsUsed] - Pmin_t2[numPdGainsUsed]); kk++) {				VpdTable_I[numPdGainsUsed][kk] = 					interpolate_signed(							   channel, pRawDataset->pChannels[idxL], pRawDataset->pChannels[idxR],							   (int16_t)VpdTable_L[numPdGainsUsed][kk], (int16_t)VpdTable_R[numPdGainsUsed][kk]);			}			/* fill VpdTable_I for this pdGain */			numPdGainsUsed++;		}		/* if this pdGain is used */	}	*pMinCalPower = Pmin_t2[0];	kk = 0; /* index for the final table */	for (ii = 0; ii < numPdGainsUsed; ii++) {		if (ii == (numPdGainsUsed - 1))			pPdGainBoundaries[ii] = Pmax_t2[ii] +				PD_GAIN_BOUNDARY_STRETCH_IN_HALF_DB;		else 			pPdGainBoundaries[ii] = (uint16_t)				((Pmax_t2[ii] + Pmin_t2[ii+1]) / 2 );		if (pPdGainBoundaries[ii] > 63) {			HALDEBUG(ah, HAL_DEBUG_ANY,			    "%s: clamp pPdGainBoundaries[%d] %d\n",			    __func__, ii, pPdGainBoundaries[ii]);/*XXX*/			pPdGainBoundaries[ii] = 63;		}		/* Find starting index for this pdGain */		if (ii == 0) 			ss = 0; /* for the first pdGain, start from index 0 */		else 			ss = (pPdGainBoundaries[ii-1] - Pmin_t2[ii]) - 				pdGainOverlap_t2;		Vpd_step = (uint16_t)(VpdTable_I[ii][1] - VpdTable_I[ii][0]);		Vpd_step = (uint16_t)((Vpd_step < 1) ? 1 : Vpd_step);		/*		 *-ve ss indicates need to extrapolate data below for this pdGain		 */		while (ss < 0) {			tmpVal = (int16_t)(VpdTable_I[ii][0] + ss*Vpd_step);			pPDADCValues[kk++] = (uint16_t)((tmpVal < 0) ? 0 : tmpVal);			ss++;		}		sizeCurrVpdTable = Pmax_t2[ii] - Pmin_t2[ii];		tgtIndex = pPdGainBoundaries[ii] + pdGainOverlap_t2 - Pmin_t2[ii];		maxIndex = (tgtIndex < sizeCurrVpdTable) ? tgtIndex : sizeCurrVpdTable;		while (ss < (int16_t)maxIndex)			pPDADCValues[kk++] = VpdTable_I[ii][ss++];		Vpd_step = (uint16_t)(VpdTable_I[ii][sizeCurrVpdTable-1] -				       VpdTable_I[ii][sizeCurrVpdTable-2]);		Vpd_step = (uint16_t)((Vpd_step < 1) ? 1 : Vpd_step);           		/*		 * for last gain, pdGainBoundary == Pmax_t2, so will 		 * have to extrapolate		 */		if (tgtIndex > maxIndex) {	/* need to extrapolate above */			while(ss < (int16_t)tgtIndex) {				tmpVal = (uint16_t)					(VpdTable_I[ii][sizeCurrVpdTable-1] + 					 (ss-maxIndex)*Vpd_step);				pPDADCValues[kk++] = (tmpVal > 127) ? 					127 : tmpVal;				ss++;			}		}				/* extrapolated above */	}					/* for all pdGainUsed */	while (ii < MAX_NUM_PDGAINS_PER_CHANNEL) {		pPdGainBoundaries[ii] = pPdGainBoundaries[ii-1];		ii++;	}	while (kk < 128) {		pPDADCValues[kk] = pPDADCValues[kk-1];		kk++;	}	return numPdGainsUsed;#undef VpdTable_L#undef VpdTable_R#undef VpdTable_I}static HAL_BOOLar2413SetPowerTable(struct ath_hal *ah,	int16_t *minPower, int16_t *maxPower, HAL_CHANNEL_INTERNAL *chan, 	uint16_t *rfXpdGain){	struct ath_hal_5212 *ahp = AH5212(ah);	const HAL_EEPROM *ee = AH_PRIVATE(ah)->ah_eeprom;	const RAW_DATA_STRUCT_2413 *pRawDataset = AH_NULL;	uint16_t pdGainOverlap_t2;	int16_t minCalPower2413_t2;	uint16_t *pdadcValues = ahp->ah_pcdacTable;	uint16_t gainBoundaries[4];	uint32_t reg32, regoffset;	int i, numPdGainsUsed;#ifndef AH_USE_INIPDGAIN	uint32_t tpcrg1;#endif	HALDEBUG(ah, HAL_DEBUG_RFPARAM, "%s: chan 0x%x flag 0x%x\n",	    __func__, chan->channel,chan->channelFlags);	if (IS_CHAN_G(chan) || IS_CHAN_108G(chan))		pRawDataset = &ee->ee_rawDataset2413[headerInfo11G];	else if (IS_CHAN_B(chan))		pRawDataset = &ee->ee_rawDataset2413[headerInfo11B];	else {		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: illegal mode\n", __func__);		return AH_FALSE;	}	pdGainOverlap_t2 = (uint16_t) SM(OS_REG_READ(ah, AR_PHY_TPCRG5),					  AR_PHY_TPCRG5_PD_GAIN_OVERLAP);    	numPdGainsUsed = ar2413getGainBoundariesAndPdadcsForPowers(ah,		chan->channel, pRawDataset, pdGainOverlap_t2,		&minCalPower2413_t2,gainBoundaries, rfXpdGain, pdadcValues);	HALASSERT(1 <= numPdGainsUsed && numPdGainsUsed <= 3);#ifdef AH_USE_INIPDGAIN	/*	 * Use pd_gains curve from eeprom; Atheros always uses	 * the default curve from the ini file but some vendors	 * (e.g. Zcomax) want to override this curve and not	 * honoring their settings results in tx power 5dBm low.	 */	OS_REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN, 			 (pRawDataset->pDataPerChannel[0].numPdGains - 1));#else	tpcrg1 = OS_REG_READ(ah, AR_PHY_TPCRG1);	tpcrg1 = (tpcrg1 &~ AR_PHY_TPCRG1_NUM_PD_GAIN)		  | SM(numPdGainsUsed-1, AR_PHY_TPCRG1_NUM_PD_GAIN);	switch (numPdGainsUsed) {	case 3:		tpcrg1 &= ~AR_PHY_TPCRG1_PDGAIN_SETTING3;		tpcrg1 |= SM(rfXpdGain[2], AR_PHY_TPCRG1_PDGAIN_SETTING3);		/* fall thru... */	case 2:		tpcrg1 &= ~AR_PHY_TPCRG1_PDGAIN_SETTING2;		tpcrg1 |= SM(rfXpdGain[1], AR_PHY_TPCRG1_PDGAIN_SETTING2);		/* fall thru... */	case 1:		tpcrg1 &= ~AR_PHY_TPCRG1_PDGAIN_SETTING1;		tpcrg1 |= SM(rfXpdGain[0], AR_PHY_TPCRG1_PDGAIN_SETTING1);		break;	}#ifdef AH_DEBUG	if (tpcrg1 != OS_REG_READ(ah, AR_PHY_TPCRG1))		HALDEBUG(ah, HAL_DEBUG_RFPARAM, "%s: using non-default "		    "pd_gains (default 0x%x, calculated 0x%x)\n",		    __func__, OS_REG_READ(ah, AR_PHY_TPCRG1), tpcrg1);#endif	OS_REG_WRITE(ah, AR_PHY_TPCRG1, tpcrg1);#endif	/*	 * Note the pdadc table may not start at 0 dBm power, could be	 * negative or greater than 0.  Need to offset the power	 * values by the amount of minPower for griffin	 */	if (minCalPower2413_t2 != 0)		ahp->ah_txPowerIndexOffset = (int16_t)(0 - minCalPower2413_t2);	else		ahp->ah_txPowerIndexOffset = 0;	/* Finally, write the power values into the baseband power table */	regoffset = 0x9800 + (672 <<2); /* beginning of pdadc table in griffin */	for (i = 0; i < 32; i++) {		reg32 = ((pdadcValues[4*i + 0] & 0xFF) << 0)  | 			((pdadcValues[4*i + 1] & 0xFF) << 8)  |			((pdadcValues[4*i + 2] & 0xFF) << 16) |			((pdadcValues[4*i + 3] & 0xFF) << 24) ;        		OS_REG_WRITE(ah, regoffset, reg32);		regoffset += 4;	}	OS_REG_WRITE(ah, AR_PHY_TPCRG5, 		     SM(pdGainOverlap_t2, AR_PHY_TPCRG5_PD_GAIN_OVERLAP) | 		     SM(gainBoundaries[0], AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1) |		     SM(gainBoundaries[1], AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2) |		     SM(gainBoundaries[2], AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3) |		     SM(gainBoundaries[3], AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4));	return AH_TRUE;}static int16_tar2413GetMinPower(struct ath_hal *ah, const RAW_DATA_PER_CHANNEL_2413 *data){	uint32_t ii,jj;	uint16_t Pmin=0,numVpd;	for (ii = 0; ii < MAX_NUM_PDGAINS_PER_CHANNEL; ii++) {		jj = MAX_NUM_PDGAINS_PER_CHANNEL - ii - 1;		/* work backwards 'cause highest pdGain for lowest power */		numVpd = data->pDataPerPDGain[jj].numVpd;		if (numVpd > 0) {			Pmin = data->pDataPerPDGain[jj].pwr_t4[0];			return(Pmin);		}	}	return(Pmin);}static int16_tar2413GetMaxPower(struct ath_hal *ah, const RAW_DATA_PER_CHANNEL_2413 *data){	uint32_t ii;	uint16_t Pmax=0,numVpd;		for (ii=0; ii< MAX_NUM_PDGAINS_PER_CHANNEL; ii++) {		/* work forwards cuase lowest pdGain for highest power */		numVpd = data->pDataPerPDGain[ii].numVpd;		if (numVpd > 0) {			Pmax = data->pDataPerPDGain[ii].pwr_t4[numVpd-1];			return(Pmax);		}	}	return(Pmax);}static HAL_BOOLar2413GetChannelMaxMinPower(struct ath_hal *ah, HAL_CHANNEL *chan,	int16_t *maxPow, int16_t *minPow){	const HAL_EEPROM *ee = AH_PRIVATE(ah)->ah_eeprom;	const RAW_DATA_STRUCT_2413 *pRawDataset = AH_NULL;	const RAW_DATA_PER_CHANNEL_2413 *data = AH_NULL;	uint16_t numChannels;	int totalD,totalF, totalMin,last, i;	*maxPow = 0;	if (IS_CHAN_G(chan) || IS_CHAN_108G(chan))		pRawDataset = &ee->ee_rawDataset2413[headerInfo11G];	else if (IS_CHAN_B(chan))		pRawDataset = &ee->ee_rawDataset2413[headerInfo11B];	else		return(AH_FALSE);	numChannels = pRawDataset->numChannels;	data = pRawDataset->pDataPerChannel;		/* Make sure the channel is in the range of the TP values 	 *  (freq piers)	 */	if (numChannels < 1)		return(AH_FALSE);	if ((chan->channel < data[0].channelValue) ||	    (chan->channel > data[numChannels-1].channelValue)) {		if (chan->channel < data[0].channelValue) {			*maxPow = ar2413GetMaxPower(ah, &data[0]);			*minPow = ar2413GetMinPower(ah, &data[0]);			return(AH_TRUE);		} else {			*maxPow = ar2413GetMaxPower(ah, &data[numChannels - 1]);			*minPow = ar2413GetMinPower(ah, &data[numChannels - 1]);			return(AH_TRUE);		}	}	/* Linearly interpolate the power value now */	for (last=0,i=0; (i<numChannels) && (chan->channel > data[i].channelValue);	     last = i++);	totalD = data[i].channelValue - data[last].channelValue;	if (totalD > 0) {		totalF = ar2413GetMaxPower(ah, &data[i]) - ar2413GetMaxPower(ah, &data[last]);		*maxPow = (int8_t) ((totalF*(chan->channel-data[last].channelValue) + 				     ar2413GetMaxPower(ah, &data[last])*totalD)/totalD);		totalMin = ar2413GetMinPower(ah, &data[i]) - ar2413GetMinPower(ah, &data[last]);		*minPow = (int8_t) ((totalMin*(chan->channel-data[last].channelValue) +				     ar2413GetMinPower(ah, &data[last])*totalD)/totalD);		return(AH_TRUE);	} else {		if (chan->channel == data[i].channelValue) {			*maxPow = ar2413GetMaxPower(ah, &data[i]);			*minPow = ar2413GetMinPower(ah, &data[i]);			return(AH_TRUE);		} else			return(AH_FALSE);	}}/* * Free memory for analog bank scratch buffers */static voidar2413RfDetach(struct ath_hal *ah){	struct ath_hal_5212 *ahp = AH5212(ah);	HALASSERT(ahp->ah_rfHal != AH_NULL);	ath_hal_free(ahp->ah_rfHal);	ahp->ah_rfHal = AH_NULL;}/* * Allocate memory for analog bank scratch buffers * Scratch Buffer will be reinitialized every reset so no need to zero now */static HAL_BOOLar2413RfAttach(struct ath_hal *ah, HAL_STATUS *status){	struct ath_hal_5212 *ahp = AH5212(ah);	struct ar2413State *priv;	HALASSERT(ah->ah_magic == AR5212_MAGIC);	HALASSERT(ahp->ah_rfHal == AH_NULL);	priv = ath_hal_malloc(sizeof(struct ar2413State));	if (priv == AH_NULL) {		HALDEBUG(ah, HAL_DEBUG_ANY,		    "%s: cannot allocate private state\n", __func__);		*status = HAL_ENOMEM;		/* XXX */		return AH_FALSE;	}	priv->base.rfDetach		= ar2413RfDetach;	priv->base.writeRegs		= ar2413WriteRegs;	priv->base.getRfBank		= ar2413GetRfBank;	priv->base.setChannel		= ar2413SetChannel;	priv->base.setRfRegs		= ar2413SetRfRegs;	priv->base.setPowerTable	= ar2413SetPowerTable;	priv->base.getChannelMaxMinPower = ar2413GetChannelMaxMinPower;	priv->base.getNfAdjust		= ar5212GetNfAdjust;	ahp->ah_pcdacTable = priv->pcdacTable;	ahp->ah_pcdacTableSize = sizeof(priv->pcdacTable);	ahp->ah_rfHal = &priv->base;	return AH_TRUE;}static HAL_BOOLar2413Probe(struct ath_hal *ah){	return IS_2413(ah);}AH_RF(RF2413, ar2413Probe, ar2413RfAttach);

⌨️ 快捷键说明

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