📄 cal_gen3.c
字号:
word[idx++] = ( ( (pCalCh->pwr3_xg0 & dbmmask) << 0) |
( (pCalCh->pwr4_xg0 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pcd2_delta_xg0 & pcdac_delta_mask) << 0) |
( (pCalCh->pcd3_delta_xg0 & pcdac_delta_mask) << 5) |
( (pCalCh->pcd4_delta_xg0 & pcdac_delta_mask) << 10) );
word[idx++] = ( ( (pCalCh->pwr1_xg3 & dbmmask) << 0) |
( (pCalCh->pwr2_xg3 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pwr3_xg3 & dbmmask) << 0) |
// ( (pCalCh->maxPower_t4 & dbmmask) << 8) );
( (pCalCh->pcd1_xg0 & pcdac_mask) << 8) ); // starting eeprom 4.3
}
} else
{
}
fill_Target_Power_and_Test_Groups(&(word[idx]), (A_UINT16)(numWords - idx + 1), dbmmask, pcdmask, freqmask);
}
void read_dataset_from_file_gen3(RAW_DATA_STRUCT_GEN3 *pDataSet, char *filename) {
uiPrintf("Reading raw data from file not supported for gen3 yet. Please provide force_piers_list\n");
exit(0);
}
void golden_iq_cal(A_UINT32 devNum, A_UINT32 mode, A_UINT32 channel) {
A_UINT32 maxIter = 40;
A_UINT32 iter = 0;
A_UINT32 complete_timeout = 4000;
A_BOOL TransmitOn = FALSE;
configSetup.eepromLoad = 1;
art_setResetParams(devNum, configSetup.pCfgFile, (A_BOOL)configSetup.eepromLoad,
(A_BOOL)configSetup.eepromHeaderLoad, (A_UCHAR)mode, configSetup.use_init);
art_resetDevice(devNum, txStation, NullID, channel, 0);
art_forceSinglePowerTxMax(devNum, 10);
waitForAck(CalSetup.customerDebug);
while (!verifyAckStr("Done with iq_cal for mode") && (iter++ < (maxIter + 1))) {
if (REWIND_TEST) {
if (TransmitOn) {
art_txContEnd(devNum);
TransmitOn = FALSE;
}
return;
}
//art_txDataSetup(devNum, IQ_CAL_RATEMASK, rxStation, 4*IQ_CAL_NUMPACKETS, 100, pattern, 2, 0, 2, 1);
if (!TransmitOn) {
art_txContBegin(devNum, CONT_FRAMED_DATA, RANDOM_PATTERN, IQ_CAL_RATE, DESC_ANT_A | USE_DESC_ANT);
TransmitOn = TRUE;
}
Sleep(100);
sendAck(devNum, "Ready to TX for iq_cal at", mode, channel, 0,CalSetup.customerDebug);
// Sleep(30);
// art_txDataBegin(devNum, complete_timeout, 0);
waitForAck(CalSetup.customerDebug);
if (verifyAckStr("Failed iq_cal. Rewind Test")) {
uiPrintf("\n\n*************** Failed iq_cal for mode %s. Retry. ********************\n",modeName[calModeFor[mode]]);
uiPrintf("recv Str = %s\n", ackRecvStr);
REWIND_TEST = TRUE;
}
}
if (TransmitOn) {
art_txContEnd(devNum);
TransmitOn = FALSE;
}
sendAck(devNum, "Consent to quit iq_cal", 0, 0, 0, CalSetup.customerDebug);
}
void dut_iq_cal(A_UINT32 devNum, A_UINT32 mode, A_UINT32 channel) {
// mode is the devlibmode here
A_UINT32 iter = 0;
A_UINT32 maxIter = 40;
A_UINT32 iterRX = 0;
A_UINT32 maxIterRX = 200;
// double pwr_meas_i = 0;
// double pwr_meas_q = 0;
A_UINT32 pwr_meas_i = 0;
A_UINT32 pwr_meas_q = 0;
A_UINT32 iq_corr_meas = 0, iq_corr_neg = 0;
A_UINT32 i_coeff, q_coeff;
A_UINT32 rddata;
//** the following added by ccshiang
long nRet,bSegmentPlaying = false;
AgN4010_Log_LogIt("<<<*** %s -- Start IQ Cal ***>>>",modeName[calModeFor[mode]]);
//** the above added by ccshiang
uiPrintf("\nL%d, Performing iq_cal for mode %s :",_module_line(),modeName[calModeFor[mode]]);
//** the following marked by ccshiang
/*
sendAck(devNum, "Initiate iq_cal at mode", mode, channel, 0, CalSetup.customerDebug);
*/
//** the above marked by ccshiang
// art_resetDevice(devNum, rxStation, NullID, channel, 0);
while ((iter++ < maxIter) &&
((pwr_meas_i < 0x0FFFFFFF) || (pwr_meas_q < 0x0FFFFFFF) || (iq_corr_meas == 0)) ){
art_resetDevice(devNum, rxStation, NullID, channel, 0);
//** the following marked by ccshiang
/*
sendAck(devNum, "Ready to RX for iq_cal at", mode, channel, iter, CalSetup.customerDebug);
waitForAck(CalSetup.customerDebug) ;
if (!verifyAckStr("Ready to TX for iq_cal at")) {
uiPrintf("ERROR: Got out of sync in iq_cal [ackStr: %s]\n", ackRecvStr);
exit(0);
}
*/
//** the above marked by ccshiang
//** the following added by ccshiang
if (!bSegmentPlaying) {
switch (mode) {
case MODE_11A:
case MODE_11G:
nRet = AgN4010_ARB_Play_Segment_11ag("ART_R6M",-20,0);
bSegmentPlaying = true;
break;
case MODE_11B:
nRet = AgN4010_ARB_Play_Segment_11b("ART_R1ML",-20,0);
bSegmentPlaying = true;
break;
}
if (nRet < 0) {
uiPrintf("\n\nERROR %d, Play_Segment() failed, RetCode %d - ending test\n",_module_error_code(),nRet);
exit(0);
}
}
//** the above added by ccshiang
Sleep(10);
art_regWrite(devNum, 0x9920, 0x1f000) ; // enable iq_cal and set sample size to 11
rddata = art_regRead(devNum, 0x9920);
rddata = (rddata >> 16) & 0x1;
iterRX = 0;
while ((rddata == 0x1) && (iterRX++ < maxIterRX)){
rddata = art_regRead(devNum, 0x9920);
rddata = (rddata >> 16) & 0x1;
Sleep(10);
// uiPrintf("[%d] rddata = %d\n", iterRX, rddata);
}
if (iterRX == maxIterRX) {
uiPrintf("iq_cal iter : %d.\n", iter);
}
pwr_meas_i = 0;
pwr_meas_q = 0;
iq_corr_meas = 0;
pwr_meas_i = art_regRead(devNum, (0x9800 + (260 << 2))) ;
pwr_meas_q = art_regRead(devNum, (0x9800 + (261 << 2))) ;
iq_corr_meas = art_regRead(devNum, (0x9800 + (262 << 2))) ;
// uiPrintf("SNOOP: pwr_I = 0x%x, pwr_Q = 0x%x, IQ_Corr = 0x%x\n", pwr_meas_i, pwr_meas_q, iq_corr_meas);
iq_corr_neg = 0;
}
if ((iter > maxIter) &&
((pwr_meas_i < 0x0FFFFFFF) || (pwr_meas_q < 0x0FFFFFFF) || (iq_corr_meas == 0)) ){
uiPrintf("\n\n*************** Failed iq_cal for mode %s. Retry. ********************\n",modeName[calModeFor[mode]]);
REWIND_TEST = TRUE;
//** the following marked by ccshiang
/*
sendAck(devNum, "Failed iq_cal. Rewind Test", 0, 0, 0, CalSetup.customerDebug);
*/
//** the above marked by ccshiang
//** the following added by ccshiang
if (bSegmentPlaying) AgN4010_ARB_Stop(true);
AgN4010_Log_LogIt("<<<*** %s -- End of IQ Cal ***>>>",modeName[calModeFor[mode]],modeName[mode]);
//** the above added by ccshiang
return;
}
if (iq_corr_meas >= 0x80000000) {
iq_corr_meas = 0xFFFFFFFF - iq_corr_meas;
iq_corr_neg = 1;
}
i_coeff = (A_UINT32)floor((128.0*(double)iq_corr_meas)/(((double)pwr_meas_i+(double)pwr_meas_q)/2.0) + 0.5);
q_coeff = (A_UINT32)floor((((double)pwr_meas_i/(double)pwr_meas_q) - 1.0)*128.0 + 0.5);
// uiPrintf("SNOOP: interm i_coeff = %d, q_coeff = %d\n", i_coeff, q_coeff);
if (CalSetup.customerDebug > 0) {
uiPrintf("pwr_I = %d, pwr_Q = %d, IQ_Corr = %d\n", pwr_meas_i, pwr_meas_q, iq_corr_meas);
}
// print i_coeff/q_coeff before truncation.
uiPrintf(" i_coeff = %d, q_coeff = %d\n", i_coeff, q_coeff);
i_coeff = (i_coeff & 0x3f);
if (iq_corr_neg == 0x0) {
i_coeff = 0x40 - i_coeff;
}
q_coeff = q_coeff & 0x1f;
// uiPrintf(" i_coeff = %d, q_coeff = %d\n", i_coeff, q_coeff);
rddata = art_regRead(devNum, 0x9920);
rddata = rddata | (1 << 11) | (i_coeff << 5) | q_coeff;
art_regWrite(devNum, 0x9920, rddata);
CalSetup.iqcal_i_corr[calModeFor[mode]] = i_coeff;
CalSetup.iqcal_q_corr[calModeFor[mode]] = q_coeff;
//** the following marked by ccshiang
/*
sendAck(devNum, "Done with iq_cal for mode", mode, channel, 0, CalSetup.customerDebug);
waitForAck(CalSetup.customerDebug);
*/
//** the above marked by ccshiang
//** the following added by ccshiang
if (bSegmentPlaying) AgN4010_ARB_Stop(true);
AgN4010_Log_LogIt("<<<*** %s -- End of IQ Cal ***>>>",modeName[calModeFor[mode]]);
//** the above added by ccshiang
}
// returns numWords and eeprom cal data for desired mode : MODE_11a, _11b, _11g
// starts filling array "word" from idx=0, so feed the pointer to the beginning of where you need to start filling
void get_cal_info_for_mode_gen3(A_UINT32 *word, A_UINT16 numWords, A_UINT16 *fbin,
A_UINT16 dbmmask, A_UINT16 pcdmask, A_UINT16 freqmask, A_UINT32 mode)
{
A_UINT16 idx = 0;
EEPROM_DATA_PER_CHANNEL_GEN3 *pCalCh;
A_UINT16 ii;
A_UINT16 pcdac_delta_mask = 0x1F;
A_UINT16 pcdac_mask = 0x3F;
A_UINT32 length;
length = checkSumLength;
// ideally want a more stringent check to ensure not to walk off the end of array
// but don't know how many words remain in "word" array. this is the absolute upper limit.
//assert(numWords < 0x400) ;
assert(numWords < length) ;
if(mode == MODE_11a)
{
// Group 1. 11a Frequency pier locations
word[idx++] = ( (fbin[1] & freqmask) << 8) | (fbin[0] & freqmask) ;
word[idx++] = ( (fbin[3] & freqmask) << 8) | (fbin[2] & freqmask) ;
word[idx++] = ( (fbin[5] & freqmask) << 8) | (fbin[4] & freqmask) ;
word[idx++] = ( (fbin[7] & freqmask) << 8) | (fbin[6] & freqmask) ;
word[idx++] = ( (fbin[9] & freqmask) << 8) | (fbin[8] & freqmask) ;
//Group 2. 11a calibration data for all frequency piers
for (ii=0; ii<pCalDataset_gen3[MODE_11a]->numChannels; ii++)
{
pCalCh = &(pCalDataset_gen3[MODE_11a]->pDataPerChannel[ii]);
word[idx++] = ( ( (pCalCh->pwr1_xg0 & dbmmask) << 0) |
( (pCalCh->pwr2_xg0 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pwr3_xg0 & dbmmask) << 0) |
( (pCalCh->pwr4_xg0 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pcd2_delta_xg0 & pcdac_delta_mask) << 0) |
( (pCalCh->pcd3_delta_xg0 & pcdac_delta_mask) << 5) |
( (pCalCh->pcd4_delta_xg0 & pcdac_delta_mask) << 10) );
word[idx++] = ( ( (pCalCh->pwr1_xg3 & dbmmask) << 0) |
( (pCalCh->pwr2_xg3 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pwr3_xg3 & dbmmask) << 0) |
// ( (pCalCh->maxPower_t4 & dbmmask) << 8) );
( (pCalCh->pcd1_xg0 & pcdac_mask) << 8) ); // starting eeprom 4.3
}
if (idx > numWords) {
uiPrintf("ERROR: get_cal_info_for_mode_gen3: ran over expected numwords [%d] in 11a cal data : %d (actual)\n", idx, numWords);
exit(0);
}
}
if(mode == MODE_11b)
{
//Group 3. 11b Calibration Piers and Calibration Information
for (ii=0; ii<pCalDataset_gen3[MODE_11b]->numChannels; ii++)
{
pCalCh = &(pCalDataset_gen3[MODE_11b]->pDataPerChannel[ii]);
word[idx++] = ( ( (pCalCh->pwr1_xg0 & dbmmask) << 0) |
( (pCalCh->pwr2_xg0 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pwr3_xg0 & dbmmask) << 0) |
( (pCalCh->pwr4_xg0 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pcd2_delta_xg0 & pcdac_delta_mask) << 0) |
( (pCalCh->pcd3_delta_xg0 & pcdac_delta_mask) << 5) |
( (pCalCh->pcd4_delta_xg0 & pcdac_delta_mask) << 10) );
word[idx++] = ( ( (pCalCh->pwr1_xg3 & dbmmask) << 0) |
( (pCalCh->pwr2_xg3 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pwr3_xg3 & dbmmask) << 0) |
// ( (pCalCh->maxPower_t4 & dbmmask) << 8) );
( (pCalCh->pcd1_xg0 & pcdac_mask) << 8) ); // starting eeprom 4.3
}
if (idx > numWords) {
uiPrintf("ERROR: get_cal_info_for_mode_gen3: ran over expected numwords [%d] in 11b cal data : %d (actual)\n", idx, numWords);
exit(0);
}
}
if(mode == MODE_11g)
{
//Group 4. 11g Calibration Piers and Calibration Information
for (ii=0; ii<pCalDataset_gen3[MODE_11g]->numChannels; ii++)
{
pCalCh = &(pCalDataset_gen3[MODE_11g]->pDataPerChannel[ii]);
word[idx++] = ( ( (pCalCh->pwr1_xg0 & dbmmask) << 0) |
( (pCalCh->pwr2_xg0 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pwr3_xg0 & dbmmask) << 0) |
( (pCalCh->pwr4_xg0 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pcd2_delta_xg0 & pcdac_delta_mask) << 0) |
( (pCalCh->pcd3_delta_xg0 & pcdac_delta_mask) << 5) |
( (pCalCh->pcd4_delta_xg0 & pcdac_delta_mask) << 10) );
word[idx++] = ( ( (pCalCh->pwr1_xg3 & dbmmask) << 0) |
( (pCalCh->pwr2_xg3 & dbmmask) << 8) );
word[idx++] = ( ( (pCalCh->pwr3_xg3 & dbmmask) << 0) |
// ( (pCalCh->maxPower_t4 & dbmmask) << 8) );
( (pCalCh->pcd1_xg0 & pcdac_mask) << 8) ); // starting eeprom 4.3
}
if (idx > numWords) {
uiPrintf("ERROR: get_cal_info_for_mode_gen3: ran over expected numwords [%d] in 11g cal data : %d (actual)\n", idx, numWords);
exit(0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -