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

📄 cal_gen3.c

📁 Atheros AP Test with Agilent N4010A source code
💻 C
📖 第 1 页 / 共 4 页
字号:

	copyPcdac = max_pcdac;
	for (ii=0; ii<pRawDataset_gen3[mode]->numChannels; ii++)
	{
		channel = pRawDataset_gen3[mode]->pDataPerChannel[ii].channelValue;

		if (ii == 0)
		{
			art_resetDevice(devNum, txStation, NullID, channel, 0);
		} else
		{
			art_changeChannel(devNum, channel); // for efficiency
		}

		uiPrintf("ch: %d  --> ", channel);
//** the following added by ccshiang
		myAtten = saved_myAtten + agiGetCableLost(channel);
		//uiPrintf("L%d, myAtten = %g\n",_module_line(),myAtten);
//** the above added by ccshiang

		if (CalSetup.cal_mult_xpd_gain_mask[mode] == 0) {
			if((swDeviceID & 0xff) >= 0x16) { // derby2
				jj = art_getFieldForMode(devNum,"rf_pdgain_lo", devlibMode, BASE);
				kk = art_getFieldForMode(devNum,"rf_pdgain_hi", devlibMode, BASE);
				pRawDataset_gen3[mode]->xpd_mask = ((1 << jj) | (1 << kk));
				xgain_list[0] = jj;
				xgain_list[1] = kk;
			} else { // derby1
				jj = art_getFieldForMode(devNum,"rf_xpd_gain", devlibMode, BASE);
				kk = jj;
				pRawDataset_gen3[mode]->xpd_mask = (1 << jj);
				xgain_list[0] = jj;
				xgain_list[1] = kk;
			}
		} else {
			jj = 0;
			pRawDataset_gen3[mode]->xpd_mask = (A_UINT16) CalSetup.cal_mult_xpd_gain_mask[mode];
			xpd_gain = CalSetup.cal_mult_xpd_gain_mask[mode];
			kk = 0;
			ll = 0;
			while (ll < 4) {
				if ((xpd_gain & 0x1) == 1) {
					if (kk > 2) {
						uiPrintf("ERROR: A maximum of 2 xpd_gains allowed to be specified in the rf_xpd_gain parameter in the eep file.\n");
						exit(0);
					}
					xgain_list[kk++] = ll;
				}
				ll++;
				xpd_gain = (xpd_gain >> 1);
			}
			if (kk == 1) {
				xgain_list[1] = xgain_list[0];
			}
		}

		jj = xgain_list[0];
		if((swDeviceID & 0xff) >= 0x16) {
			art_writeField(devNum, "rf_pdgain_lo", jj);
			art_writeField(devNum, "rf_pdgain_hi", jj);
		} else {
			uiPrintf("SNOOP: xgain0 = %d[%d]\n", xgain_list[0], jj);
			art_writeField(devNum, "rf_xpd_gain", jj);
		}
		pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].xpd_gain = (A_UINT16)jj;
		pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].numPcdacs = NUM_POINTS_XPD0;

		pcdac = copyPcdac;
		art_ForceSinglePCDACTable(devNum, pcdac);
		art_forceSinglePowerTxMax(devNum, 0);
		art_txContBegin(devNum, CONT_FRAMED_DATA, RANDOM_PATTERN,
						rates[0], DESC_ANT_A | USE_DESC_ANT);
		Sleep(50); // sleep 20 ms

		art_ForceSinglePCDACTable(devNum, pcdac);
		Sleep(sleep_interval);
		maxPower = pmMeasAvgPower(devPM, reset) + myAtten;
		if (maxPower < 10) {
			Sleep(sleep_interval);
			maxPower = pmMeasAvgPower(devPM, reset) + myAtten;
		}
		if (maxPower < 10) {
			uiPrintf("The max transmit Power is too small (%3.2f) at ch = %d. Giving up.\n", maxPower, channel);
			REWIND_TEST = TRUE;
//** the following added by ccshiang
			if (AgN4010.boolPauseAfterPowerCalFailed) {
				long boolShow = true;
				while (agiShowPauseThenMeasurePower(boolShow,&maxPower)) {
					printf("<%3.1f+%3.1f=%3.1f>"
							,maxPower,myAtten,maxPower+myAtten);
					boolShow = false;
				}
			}
//** the above added by ccshiang
			return;
		}

		//if max power is less than the desired attemptPower, try to achieve it slowly
		if (maxPower < attemptPower) {
			tempPcdac = pcdac;
//printf("SNOOP: attempting to achieve power of %6.2f\n", attemptPower);
			while ((maxPower < attemptPower) && (tempPcdac < 62)) {
				art_ForceSinglePCDACTable(devNum, ++tempPcdac);
				Sleep(sleep_interval);
				maxPower = pmMeasAvgPower(devPM, reset) + myAtten;
//printf("SNOOP: got power of %6.2f for pcdac %d\n", maxPower, tempPcdac);
			}
			max_pcdac = tempPcdac;
		}

		if (maxPower > CalSetup.maxPowerCap[mode]) {
			pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4 = (A_UINT16)(4*CalSetup.maxPowerCap[mode] + 0.5);
		} else {
			pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4 = (A_UINT16)(4*maxPower + 0.5);
		}

		if (CalSetup.customerDebug) {
			uiPrintf("maxPower = %3.2f", ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4/4.0));
		} else {
			if(max_pcdac < 63) {
				uiPrintf("pcdac limited pwr is %2.1f dBm (pcdac %d)\n", ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4/4.0), max_pcdac) ;
			} else {
			uiPrintf("max pwr is %2.1f dBm\n", ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4/4.0)) ;
		}
		}

		lo_pcd = 1;
		art_ForceSinglePCDACTable(devNum, lo_pcd);
		Sleep(sleep_interval);
		power = pmMeasAvgPower(devPM, reset) + myAtten ;
		if (fabs(power - maxPower) < 10.0) {
			art_ForceSinglePCDACTable(devNum, 1);
			Sleep(sleep_interval);
			power = pmMeasAvgPower(devPM, reset) + myAtten ;
		}
		pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[0] = (A_UINT16)(4*power + 0.5);
		pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[0]  = lo_pcd;
		gain1 = read_gainf_twice(devNum) ;
		if (gain1 < 5) {  // possibly a bad reading
			gain1 = read_gainf_twice(devNum) ;
		}
		pwr1 = power;
		if (CalSetup.customerDebug) {
			uiPrintf(", %3.2f[%d]", power, lo_pcd);
		}

		lo_pcd = 25;
		art_ForceSinglePCDACTable(devNum, lo_pcd);
		Sleep(sleep_interval);
		power = pmMeasAvgPower(devPM, reset) + myAtten ;
		gain25 = read_gainf_twice(devNum) ;
		if (gain25 < 5) {  // possibly a bad reading
			gain25 = read_gainf_twice(devNum) ;
		}
		pwr25 = power;
		if (CalSetup.customerDebug) {
			uiPrintf(", %3.2f[%d]", power, lo_pcd);
		}

		// start search for highest linear power at pcdac for (maxPower - 3dB)
		lo_pcd = (A_UINT16)((((maxPower - 3) - pwr1)/(pwr25 - pwr1))*(25 - 1) + 1);
		if ((lo_pcd < 0) || (lo_pcd > 56)) {
			lo_pcd = 56;
		}
		art_ForceSinglePCDACTable(devNum, lo_pcd);
		Sleep(10);
		gainF = read_gainf_twice(devNum) ;
		intp_gain = (A_UINT16)(((lo_pcd - 1)/(25 - 1))*(gain25 - gain1) + gain1);

		dirxn = (gainF > (intp_gain + 5)) ? -1 : 1;

		prev_gain = gainF;
		if (dirxn < 0) {
			while ((abs(gainF - prev_gain) < 4) && (lo_pcd < max_pcdac)){
				lo_pcd -= dirxn ;
				prev_gain = gainF;
				if (CalSetup.customerDebug) printf("SNOOP: loop 1 dirxn-1 = %d : pcd=%d, prev_gF=%d", dirxn, lo_pcd, prev_gain);
				art_ForceSinglePCDACTable(devNum, lo_pcd);
				Sleep(10);
				gainF = read_gainf_twice(devNum) ;
				if (CalSetup.customerDebug) printf(", gF=%d\n", gainF);
			}

			while ((abs(gainF - prev_gain) >= 4) && (lo_pcd < max_pcdac)){
				lo_pcd += dirxn ;
				prev_gain = gainF;
				if (CalSetup.customerDebug) printf("SNOOP: loop 2 dirxn-1 = %d : pcd=%d, prev_gF=%d", dirxn, lo_pcd, prev_gain);
				art_ForceSinglePCDACTable(devNum, lo_pcd);
				Sleep(10);
				gainF = read_gainf_twice(devNum) ;
				if (CalSetup.customerDebug) printf(", gF=%d\n", gainF);
			}
		} else {  // dirxn > 0
			prev_gain = 107;
			while ((abs(gainF - prev_gain) >= 4) && (lo_pcd < max_pcdac)){
				lo_pcd -= dirxn ;
				prev_gain = gainF;
				if (CalSetup.customerDebug) printf("SNOOP: loop 1 dirxn1 = %d : pcd=%d, prev_gF=%d", dirxn, lo_pcd, prev_gain);
				art_ForceSinglePCDACTable(devNum, lo_pcd);
				Sleep(10);
				gainF = read_gainf_twice(devNum) ;
				if (CalSetup.customerDebug) printf(", gF=%d\n", gainF);
			}

			while ((abs(gainF - prev_gain) < 4) && (lo_pcd < max_pcdac)) {
				lo_pcd += dirxn ;
				prev_gain = gainF;
				if (CalSetup.customerDebug) printf("SNOOP: loop 2 dirxn1 = %d : pcd=%d, prev_gF=%d", dirxn, lo_pcd, prev_gain);
				art_ForceSinglePCDACTable(devNum, lo_pcd);
				Sleep(10);
				gainF = read_gainf_twice(devNum) ;
				if (CalSetup.customerDebug) printf(", gF=%d\n", gainF);
			}
			lo_pcd -= dirxn;
		}
		lo_pcd -= 1; // back off 1 into linear range

		if (lo_pcd > max_pcdac) {
			lo_pcd = max_pcdac;
		}
		art_ForceSinglePCDACTable(devNum, lo_pcd);
		Sleep(sleep_interval);
		power = pmMeasAvgPower(devPM, reset) + myAtten ;

		// highest linear power
		pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] = (A_UINT16)(4*power + 0.5);
		pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2]  = lo_pcd;

		// if highest linear pcdac > 40, use pcdacs (25, 70% intrcpt[25,pcdMaxLin], pcdMaxLin, pcdMaxPwr) instead
		// of (1, 25, pcdMaxLin, pcdMaxPwr).


		if (CalSetup.customerDebug) printf("SNOOP: pcd2=%d, pwr2=%f\n", lo_pcd, power);
		if (lo_pcd > 40) {
			if (CalSetup.customerDebug) printf("SNOOP: lo_pcd is > 40 : %d\n", lo_pcd);
			pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[0] = (A_UINT16)(4*pwr25 + 0.5);
			pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[0]  = 25;
			if (CalSetup.customerDebug) printf("SNOOP: pcd0=%d, pwr0=%f\n", 25, pwr25);
//			lo_pcd = (A_UINT16)(0.75*(lo_pcd-1) + 1);
//			if (lo_pcd > 32) {
//				lo_pcd = 32;
//			}
			lo_pcd = (A_UINT16)(0.7*(lo_pcd-25) + 25);
			if (lo_pcd > 56) {
				lo_pcd = 56;
			}
			art_ForceSinglePCDACTable(devNum, lo_pcd);
			Sleep(sleep_interval);
			power = pmMeasAvgPower(devPM, reset) + myAtten ;
			pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[1] = (A_UINT16)(4*power + 0.5);
			pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[1]  = lo_pcd;
			if (CalSetup.customerDebug) printf("SNOOP: pcd1=%d, pwr1=%f\n", lo_pcd, power);
		} else {
			if (CalSetup.customerDebug) printf("SNOOP: lo_pcd is < 40 : %d\n", lo_pcd);
			pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[1] = (A_UINT16)(4*pwr25 + 0.5);
			pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[1]  = 25;
			if (CalSetup.customerDebug) printf("SNOOP: pcd1=%d, pwr1=%f\n", 25, pwr25);
		}

		power = ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2])/4.0;

		// limit power[2] to maxPowerCap if highest linear power > maxPower
		if (power >= CalSetup.maxPowerCap[mode]) {
			pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] = pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4;
			pcd1 = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[1];
			pcd2 = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2];
			pwrL = (double) ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[1]/4.0);
			pwrH = power;
			pcd_interp = (A_INT16)( ( (CalSetup.maxPowerCap[mode] - pwrL)*pcd2 + (pwrH - CalSetup.maxPowerCap[mode])*pcd1)/(pwrH - pwrL));
			//uiPrintf("SNOOP: maxpwr2 : pcdI = %d, pcd1 = %d, pcd2 = %d, pwr1 = %3.1f, pwr2 = %3.1f, pwrT = %3.1f\n", pcd_interp, pcd1, pcd2, pwrL, pwrH, CalSetup.maxPowerCap[mode]);
			if ((pcd_interp >= pcd1) && (pcd_interp <= pcd2)) {
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2]  = pcd_interp;
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3]  = pcd_interp;
			pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4;
			} else {
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2]  = pcd2;
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] = (A_UINT16) (4*pwrH);
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3]  = pcd2;
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = (A_UINT16) (4*pwrH);
			}
		} else {

			// search for min pcdac corresponding to maxPower

			lo_pcd = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2];
			if (lo_pcd == max_pcdac) { // not hit saturation yet
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2];
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3]  = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2];
				if (CalSetup.customerDebug) printf("SNOOP: pcd3=%d, pwr3=%f\n", lo_pcd, (pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] - 0.5)/4);
				lo_pcd = 47;
				art_ForceSinglePCDACTable(devNum, lo_pcd);
				Sleep(sleep_interval);
				power = pmMeasAvgPower(devPM, reset) + myAtten ;
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] = (A_UINT16)(4*power + 0.5);
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2]  = lo_pcd;
				if (CalSetup.customerDebug) printf("SNOOP: pcd2=%d, pwr2=%f\n", lo_pcd, (pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2] - 0.5)/4);
			} else {
				art_ForceSinglePCDACTable(devNum, lo_pcd);
				Sleep(10);
				gainF = read_gainf_twice(devNum) ;
				prev_gain = 107;
				while (((gainF < 100) || (gainF == prev_gain))&& (lo_pcd < max_pcdac)){
					lo_pcd++;
					art_ForceSinglePCDACTable(devNum, lo_pcd);
					Sleep(10);
					prev_gain = gainF;
					gainF = read_gainf_twice(devNum) ;
					if (CalSetup.customerDebug) printf("SNOOP: gainF = %d, pcd = %d\n", gainF, lo_pcd);
				}
				Sleep(sleep_interval);
				power = pmMeasAvgPower(devPM, reset) + myAtten ;
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = (A_UINT16)(4*power + 0.5);
				pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3]  = lo_pcd;
				if (CalSetup.customerDebug) printf("SNOOP: pcd3=%d, pwr3=%f\n", lo_pcd, power);

				// limit power[3] to maxPowerCap if highest power > maxPower
				if (power >= CalSetup.maxPowerCap[mode]) {
					pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = pRawDataset_gen3[mode]->pDataPerChannel[ii].maxPower_t4;
					pcd1 = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[2];
					pcd2 = pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3];
					pwrL = (double) ((double)pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[2]/4.0);
					pwrH = power;
					if (pwrH == pwrL) {
						pcd_interp = pcd2;
					} else {
						pcd_interp = (A_INT16)( ( (CalSetup.maxPowerCap[mode] - pwrL)*pcd2 + (pwrH - CalSetup.maxPowerCap[mode])*pcd1)/(pwrH - pwrL));
					}
					//uiPrintf("SNOOP: maxpwr3 : pcdI = %d, pcd1 = %d, pcd2 = %d, pwr1 = %3.1f, pwr2 = %3.1f, pwrT = %3.1f\n", pcd_interp, pcd1, pcd2, pwrL, pwrH, CalSetup.maxPowerCap[mode]);
					if ((pcd_interp >= pcd1) && (pcd_interp <= pcd2)) {
						pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3]  = pcd_interp;
					} else {
						pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pcdac[3]  = pcd2;
						pRawDataset_gen3[mode]->pDataPerChannel[ii].pDataPerXPD[jj].pwr_t4[3] = (A_UINT16) (4*pwrH);
					}
				}
			}
		}

/*
//		hi_pcd = (A_UINT16)(lo_pcd + (maxPower - power)*curr_intercept_estimate/10.0 - 5);
		hi_pcd = 55;
//		if (hi_pcd > 63) hi_pcd = 63;
//		if (hi_pcd < 0) {
//			uiPrintf("The max transmit Power (%3.2f) is too close to power at pcdac = 1 (%3.2f) at ch = %d. Try again.\n", maxPower, power, channel);
//			REWIND_TEST = TRUE;
//			return;
//			hi_pcd = 45;
//		}
		art_ForceSinglePCDACTable(devNum, hi_pcd);
		Sleep(sleep_interval);
		power = pmMeasAvgPower(devPM, reset) + myAtten ;
		gainF = read_gainf_twice(devNum) ;
		if (CalSetup.customerDebug) {
			uiPrintf(", %3.2f[%d, %d]", power, hi_pcd, gainF);
		}
		tmpPower = power;
		tmpGainF = gainF;
		if (power < (maxPower - 1.5)) {
			hi_pcd += 5;
			art_ForceSinglePCDACTable(devNum, hi_pcd);

⌨️ 快捷键说明

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