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

📄 ah_eeprom_v3.c.svn-base

📁 最新之atheros芯片driver source code, 基于linux操作系统,內含atheros芯片HAL全部代码
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
        if (mode == headerInfo11A)            freq[numPiers++] = fbin2freq(ee, (eeval >> 8) & freqmask);        else            freq[numPiers++] = fbin2freq_2p4(ee, (eeval >> 8) & freqmask);    }	ar2413SetupEEPROMDataset(pCalDataset, numPiers, &freq[0]);	idx = start_offset + (maxPiers / 2);	for (ii = 0; ii < pCalDataset->numChannels; ii++) {		EEPROM_DATA_PER_CHANNEL_2413 *currCh =			&(pCalDataset->pDataPerChannel[ii]);		if (currCh->numPdGains > 0) {			/*			 * Read the first NUM_POINTS_OTHER_PDGAINS pwr			 * and Vpd values for pdgain_0			 */			EEREAD(idx++);			currCh->pwr_I[0] = eeval & dbm_I_mask;			currCh->Vpd_I[0] = (eeval >> 5) & Vpd_I_mask;			currCh->pwr_delta_t2[0][0] =				(eeval >> 12) & dbm_delta_mask;						EEREAD(idx++);			currCh->Vpd_delta[0][0] = eeval & Vpd_delta_mask;			currCh->pwr_delta_t2[1][0] =				(eeval >> 6) & dbm_delta_mask;			currCh->Vpd_delta[1][0] =				(eeval >> 10) & Vpd_delta_mask;						EEREAD(idx++);			currCh->pwr_delta_t2[2][0] = eeval & dbm_delta_mask;			currCh->Vpd_delta[2][0] = (eeval >> 4) & Vpd_delta_mask;		}				if (currCh->numPdGains > 1) {			/*			 * Read the first NUM_POINTS_OTHER_PDGAINS pwr			 * and Vpd values for pdgain_1			 */			currCh->pwr_I[1] = (eeval >> 10) & dbm_I_mask;			currCh->Vpd_I[1] = (eeval >> 15) & 0x1;						EEREAD(idx++);			/* upper 6 bits */			currCh->Vpd_I[1] |= (eeval & 0x3F) << 1;			currCh->pwr_delta_t2[0][1] =				(eeval >> 6) & dbm_delta_mask;			currCh->Vpd_delta[0][1] =				(eeval >> 10) & Vpd_delta_mask;						EEREAD(idx++);			currCh->pwr_delta_t2[1][1] = eeval & dbm_delta_mask;			currCh->Vpd_delta[1][1] = (eeval >> 4) & Vpd_delta_mask;			currCh->pwr_delta_t2[2][1] =				(eeval >> 10) & dbm_delta_mask;			currCh->Vpd_delta[2][1] = (eeval >> 14) & 0x3;						EEREAD(idx++);			/* upper 4 bits */			currCh->Vpd_delta[2][1] |= (eeval & 0xF) << 2;		} else if (currCh->numPdGains == 1) {			/*			 * Read the last pwr and Vpd values for pdgain_0			 */			currCh->pwr_delta_t2[3][0] =				(eeval >> 10) & dbm_delta_mask;			currCh->Vpd_delta[3][0] = (eeval >> 14) & 0x3;			EEREAD(idx++);			/* upper 4 bits */			currCh->Vpd_delta[3][0] |= (eeval & 0xF) << 2;			/* 4 words if numPdGains == 1 */		}		if (currCh->numPdGains > 2) {			/*			 * Read the first NUM_POINTS_OTHER_PDGAINS pwr			 * and Vpd values for pdgain_2			 */			currCh->pwr_I[2] = (eeval >> 4) & dbm_I_mask;			currCh->Vpd_I[2] = (eeval >> 9) & Vpd_I_mask;						EEREAD(idx++);			currCh->pwr_delta_t2[0][2] =				(eeval >> 0) & dbm_delta_mask;			currCh->Vpd_delta[0][2] = (eeval >> 4) & Vpd_delta_mask;			currCh->pwr_delta_t2[1][2] =				(eeval >> 10) & dbm_delta_mask;			currCh->Vpd_delta[1][2] = (eeval >> 14) & 0x3;						EEREAD(idx++);			/* upper 4 bits */			currCh->Vpd_delta[1][2] |= (eeval & 0xF) << 2;			currCh->pwr_delta_t2[2][2] =				(eeval >> 4) & dbm_delta_mask;			currCh->Vpd_delta[2][2] = (eeval >> 8) & Vpd_delta_mask;		} else if (currCh->numPdGains == 2) {			/*			 * Read the last pwr and Vpd values for pdgain_1			 */			currCh->pwr_delta_t2[3][1] =				(eeval >> 4) & dbm_delta_mask;			currCh->Vpd_delta[3][1] = (eeval >> 8) & Vpd_delta_mask;			/* 6 words if numPdGains == 2 */		}		if (currCh->numPdGains > 3) {			/*			 * Read the first NUM_POINTS_OTHER_PDGAINS pwr			 * and Vpd values for pdgain_3			 */			currCh->pwr_I[3] = (eeval >> 14) & 0x3;						EEREAD(idx++);			/* upper 3 bits */			currCh->pwr_I[3] |= ((eeval >> 0) & 0x7) << 2;			currCh->Vpd_I[3] = (eeval >> 3) & Vpd_I_mask;			currCh->pwr_delta_t2[0][3] =				(eeval >> 10) & dbm_delta_mask;			currCh->Vpd_delta[0][3] = (eeval >> 14) & 0x3;						EEREAD(idx++);			/* upper 4 bits */			currCh->Vpd_delta[0][3] |= (eeval & 0xF) << 2;			currCh->pwr_delta_t2[1][3] =				(eeval >> 4) & dbm_delta_mask;			currCh->Vpd_delta[1][3] = (eeval >> 8) & Vpd_delta_mask;			currCh->pwr_delta_t2[2][3] = (eeval >> 14) & 0x3;						EEREAD(idx++);			/* upper 2 bits */			currCh->pwr_delta_t2[2][3] |= ((eeval >> 0) & 0x3) << 2;			currCh->Vpd_delta[2][3] = (eeval >> 2) & Vpd_delta_mask;			currCh->pwr_delta_t2[3][3] =				(eeval >> 8) & dbm_delta_mask;			currCh->Vpd_delta[3][3] = (eeval >> 12) & 0xF;						EEREAD(idx++);			/* upper 2 bits */			currCh->Vpd_delta[3][3] |= ((eeval >> 0) & 0x3) << 4;			/* 12 words if numPdGains == 4 */		} else if (currCh->numPdGains == 3) {			/* read the last pwr and Vpd values for pdgain_2 */			currCh->pwr_delta_t2[3][2] = (eeval >> 14) & 0x3;						EEREAD(idx++);			/* upper 2 bits */			currCh->pwr_delta_t2[3][2] |= ((eeval >> 0) & 0x3) << 2;			currCh->Vpd_delta[3][2] = (eeval >> 2) & Vpd_delta_mask;			/* 9 words if numPdGains == 3 */		}	}	return AH_TRUE;#undef EEREAD}static voidar2413SetupRawDataset(RAW_DATA_STRUCT_2413 *pRaw, EEPROM_DATA_STRUCT_2413 *pCal){	uint16_t i, j, kk, channelValue;	uint16_t xpd_mask;	uint16_t numPdGainsUsed;	pRaw->numChannels = pCal->numChannels;	xpd_mask = pRaw->xpd_mask;	numPdGainsUsed = 0;	if ((xpd_mask >> 0) & 0x1) numPdGainsUsed++;	if ((xpd_mask >> 1) & 0x1) numPdGainsUsed++;	if ((xpd_mask >> 2) & 0x1) numPdGainsUsed++;	if ((xpd_mask >> 3) & 0x1) numPdGainsUsed++;	for (i = 0; i < pCal->numChannels; i++) {		channelValue = pCal->pChannels[i];		pRaw->pChannels[i] = channelValue;		pRaw->pDataPerChannel[i].channelValue = channelValue;		pRaw->pDataPerChannel[i].numPdGains = numPdGainsUsed;		kk = 0;		for (j = 0; j < MAX_NUM_PDGAINS_PER_CHANNEL; j++) {			pRaw->pDataPerChannel[i].pDataPerPDGain[j].pd_gain = j;			if ((xpd_mask >> j) & 0x1) {				pRaw->pDataPerChannel[i].pDataPerPDGain[j].numVpd = NUM_POINTS_OTHER_PDGAINS;				kk++;				if (kk == 1) {					/* 					 * lowest pd_gain corresponds					 *  to highest power and thus,					 *  has one more point					 */					pRaw->pDataPerChannel[i].pDataPerPDGain[j].numVpd = NUM_POINTS_LAST_PDGAIN;				}			} else {				pRaw->pDataPerChannel[i].pDataPerPDGain[j].numVpd = 0;			}		}	}}static HAL_BOOLar2413EepromToRawDataset(struct ath_hal *ah,	EEPROM_DATA_STRUCT_2413 *pCal, RAW_DATA_STRUCT_2413 *pRaw){	uint16_t ii, jj, kk, ss;	RAW_DATA_PER_PDGAIN_2413 *pRawXPD;	/* ptr to array of info held per channel */	EEPROM_DATA_PER_CHANNEL_2413 *pCalCh;	uint16_t xgain_list[MAX_NUM_PDGAINS_PER_CHANNEL];	uint16_t xpd_mask;	uint32_t numPdGainsUsed;	HALASSERT(pRaw->xpd_mask == pCal->xpd_mask);	xgain_list[0] = 0xDEAD;	xgain_list[1] = 0xDEAD;	xgain_list[2] = 0xDEAD;	xgain_list[3] = 0xDEAD;	numPdGainsUsed = 0;	xpd_mask = pRaw->xpd_mask;	for (jj = 0; jj < MAX_NUM_PDGAINS_PER_CHANNEL; jj++) {		if ((xpd_mask >> (MAX_NUM_PDGAINS_PER_CHANNEL-jj-1)) & 1)			xgain_list[numPdGainsUsed++] = MAX_NUM_PDGAINS_PER_CHANNEL-jj-1;	}	pRaw->numChannels = pCal->numChannels;	for (ii = 0; ii < pRaw->numChannels; ii++) {		pCalCh = &(pCal->pDataPerChannel[ii]);		pRaw->pDataPerChannel[ii].channelValue = pCalCh->channelValue;		/* numVpd has already been setup appropriately for the relevant pdGains */		for (jj = 0; jj < numPdGainsUsed; jj++) {			/* use jj for calDataset and ss for rawDataset */			ss = xgain_list[jj];			pRawXPD = &(pRaw->pDataPerChannel[ii].pDataPerPDGain[ss]);			HALASSERT(pRawXPD->numVpd >= 1);			pRawXPD->pwr_t4[0] = (uint16_t)(4*pCalCh->pwr_I[jj]);			pRawXPD->Vpd[0]    = pCalCh->Vpd_I[jj];			for (kk = 1; kk < pRawXPD->numVpd; kk++) {				pRawXPD->pwr_t4[kk] = (int16_t)(pRawXPD->pwr_t4[kk-1] + 2*pCalCh->pwr_delta_t2[kk-1][jj]);				pRawXPD->Vpd[kk] = (uint16_t)(pRawXPD->Vpd[kk-1] + pCalCh->Vpd_delta[kk-1][jj]);			}			/* loop over Vpds */		}		/* loop over pd_gains */	}	/* loop over channels */	return AH_TRUE;}static HAL_BOOLreadEepromRawPowerCalInfo2413(struct ath_hal *ah, HAL_EEPROM *ee){	/* NB: index is 1 less than numPdgains */	static const uint16_t wordsForPdgains[] = { 4, 6, 9, 12 };	EEPROM_DATA_STRUCT_2413 *pCal = AH_NULL;	RAW_DATA_STRUCT_2413 *pRaw;	int numEEPROMWordsPerChannel;	uint32_t off;	HAL_BOOL ret = AH_FALSE;		HALASSERT(ee->ee_version >= AR_EEPROM_VER5_0);	HALASSERT(ee->ee_eepMap == 2);		pCal = ath_hal_malloc(sizeof(EEPROM_DATA_STRUCT_2413));	if (pCal == AH_NULL)		goto exit;		off = ee->ee_eepMap2PowerCalStart;	if (ee->ee_Amode) {		OS_MEMZERO(pCal, sizeof(EEPROM_DATA_STRUCT_2413));		pCal->xpd_mask = ee->ee_xgain[headerInfo11A];		if (!ar2413ReadCalDataset(ah, ee, pCal, off,			NUM_11A_EEPROM_CHANNELS_2413, headerInfo11A)) {			goto exit;		}		pRaw = &ee->ee_rawDataset2413[headerInfo11A];		pRaw->xpd_mask = ee->ee_xgain[headerInfo11A];		ar2413SetupRawDataset(pRaw, pCal);		if (!ar2413EepromToRawDataset(ah, pCal, pRaw)) {			goto exit;		}		/* setup offsets for mode_11a next */		numEEPROMWordsPerChannel = wordsForPdgains[			pCal->pDataPerChannel[0].numPdGains - 1];		off += pCal->numChannels * numEEPROMWordsPerChannel + 5;	}	if (ee->ee_Bmode) {		OS_MEMZERO(pCal, sizeof(EEPROM_DATA_STRUCT_2413));		pCal->xpd_mask = ee->ee_xgain[headerInfo11B];		if (!ar2413ReadCalDataset(ah, ee, pCal, off,			NUM_2_4_EEPROM_CHANNELS_2413 , headerInfo11B)) {			goto exit;		}		pRaw = &ee->ee_rawDataset2413[headerInfo11B];		pRaw->xpd_mask = ee->ee_xgain[headerInfo11B];		ar2413SetupRawDataset(pRaw, pCal);		if (!ar2413EepromToRawDataset(ah, pCal, pRaw)) {			goto exit;		}		/* setup offsets for mode_11g next */		numEEPROMWordsPerChannel = wordsForPdgains[			pCal->pDataPerChannel[0].numPdGains - 1];		off += pCal->numChannels * numEEPROMWordsPerChannel + 2;	}	if (ee->ee_Gmode) {		OS_MEMZERO(pCal, sizeof(EEPROM_DATA_STRUCT_2413));		pCal->xpd_mask = ee->ee_xgain[headerInfo11G];		if (!ar2413ReadCalDataset(ah, ee, pCal, off,			NUM_2_4_EEPROM_CHANNELS_2413, headerInfo11G)) {			goto exit;		}		pRaw = &ee->ee_rawDataset2413[headerInfo11G];		pRaw->xpd_mask = ee->ee_xgain[headerInfo11G];		ar2413SetupRawDataset(pRaw, pCal);		if (!ar2413EepromToRawDataset(ah, pCal, pRaw)) {			goto exit;		}	}	ret = AH_TRUE; exit:	if (pCal != AH_NULL)		ath_hal_free(pCal);	return ret;}/* * Now copy EEPROM Raw Power Calibration per frequency contents  * into the allocated space */static HAL_BOOLreadEepromRawPowerCalInfo(struct ath_hal *ah, HAL_EEPROM *ee){#define	EEREAD(_off) do {				\	if (!ath_hal_eepromRead(ah, _off, &eeval))	\		return AH_FALSE;			\} while (0)	uint16_t eeval, nchan;	uint32_t off;	int i, j, mode;        if (ee->ee_version >= AR_EEPROM_VER4_0 && ee->ee_eepMap == 1)		return readEepromRawPowerCalInfo5112(ah, ee);	if (ee->ee_version >= AR_EEPROM_VER5_0 && ee->ee_eepMap == 2)		return readEepromRawPowerCalInfo2413(ah, ee);	/*	 * Group 2:  read raw power data for all frequency piers	 *	 * NOTE: Group 2 contains the raw power calibration	 *	 information for each of the channels that	 *	 we recorded above.	 */	for (mode = headerInfo11A; mode <= headerInfo11G; mode++) {		uint16_t *pChannels = AH_NULL;		DATA_PER_CHANNEL *pChannelData = AH_NULL;		off = ee->ee_version >= AR_EEPROM_VER3_3 ? 			GROUPS_OFFSET3_3 : GROUPS_OFFSET3_2;		switch (mode) {		case headerInfo11A:			off      	+= GROUP2_OFFSET;			nchan		= ee->ee_numChannels11a;			pChannelData	= ee->ee_dataPerChannel11a;			pChannels	= ee->ee_channels11a;			break;		case headerInfo11B:			if (!ee->ee_Bmode)				continue;			off		+= GROUP3_OFFSET;			nchan		= ee->ee_numChannels2_4;			pChannelData	= ee->ee_dataPerChannel11b;			pChannels	= ee->ee_channels11b;			break;		case headerInfo11G:			if (!ee->ee_Gmode)				continue;			off		+= GROUP4_OFFSET;			nchan		= ee->ee_numChannels2_4;			pChannelData	= ee->ee_dataPerChannel11g;			pChannels	= ee->ee_channels11g;			break;		default:			HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid mode 0x%x\n",			    __func__, mode);			return AH_FALSE;		}		for (i = 0; i < nchan; i++) {			pChannelData->channelValue = pChannels[i];			EEREAD(off++);			pChannelData->pcdacMax     = (uint16_t)((eeval >> 10) & PCDAC_MASK);			pChannelData->pcdacMin     = (uint16_t)((eeval >> 4) & PCDAC_MASK);			pChannelData->PwrValues[0] = (uint16_t)((eeval << 2) & POWER_MASK);			EEREAD(off++);			pChannelData->PwrValues[0] |= (uint16_t)((eeval >> 14) & 0x3);			pChannelData->PwrValues[1] = (uint16_t)((eeval >> 8) & POWER_MASK);			pChannelData->PwrValues[2] = (uint16_t)((eeval >> 2) & POWER_MASK);			pChannelData->PwrValues[3] = (uint16_t)((eeval << 4) & POWER_MASK);			EEREAD(off++);			pChannelData->PwrValues[3] |= (uint16_t)((eeval >> 12) & 0xf);			pChannelData->PwrValues[4] = (uint16_t)((eeval >> 6) & POWER_MASK);			pChannelData->PwrValues[5] = (uint16_t)(eeval  & POWER_MASK);			EEREAD(off++);			pChannelData->PwrValues[6] = (uint16_t)((eeval >> 10) & POWER_MASK);			pChannelData->PwrValues[7] = (uint16_t)((eeval >> 4) & POWER_MASK);			pChannelData->PwrValues[8] = (uint16_t)((eeval << 2) & POWER_MASK);			EEREAD(off++);			pChannelData->PwrValues[8] |= (uint16_t)((eeval >> 14) & 0x3);			pChannelData->PwrValues[9] = (uint16_t)((eeval >> 8) & POWER_MASK);			pChannelData->PwrValues[10] = (uint16_t)((eeval >> 2) & POWER_MASK);			getPcdacInterceptsFromPcdacMinMax(ee,				pChannelData->pcdacMin, pChannelData->pcdacMax,				pChannelData->PcdacValues) ;			for (j = 0; j < pChannelData->numPcdacValues; j++) {				pChannelData->PwrValues[j] = (uint16_t)(					PWR_STEP * pChannelData->PwrValues[j]);				/* Note these values are scaled up. */			}			pChannelData++;		}	}	return AH_TRUE;#undef EEREAD}/* * Copy EEPROM Target Power Calbration per rate contents  * into the allocated space */static HAL_BOOLreadEepromTargetPowerCalInfo(struct ath_hal *ah, HAL_EEPROM *ee){#define	EEREAD(_off) do {				\	if (!ath_hal_eepromRead(ah, _off, &eeval))	\		return AH_FALSE;			\} while (0)	uint16_t eeval, enable24;	uint32_t off;	int i, mode, nchan;	enable24 = ee->ee_Bmode || ee->ee_Gmode;	for (mode = headerInfo11A; mode <= headerInfo11G; mode++) {		TRGT_POWER_INFO *pPowerInfo;		uint16_t *pNumTrgtChannels;		off = ee->ee_version >= AR_EEPROM_VER4_0 ?				ee->ee_targetPowersStart - GROUP5_OFFSET :		      ee->ee_version >= AR_EEPROM_VER3_3 ?				GROUPS_OFFSET3_3 : GROUPS_OFFSET3_2;		switch (mode) {		case headerInfo11A:			off += GROUP5_OFFSET;			nchan = NUM_TEST_FREQUENCIES;			pPowerInfo = ee->ee_trgtPwr_11a;

⌨️ 快捷键说明

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