📄 ah_eeprom_v3.c.svn-base
字号:
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 + -