/*****************************************************************************/ /** * Description: Antenna configuration functions. * * Author: Fan Hao * Date: 2022-06-18 16:37 * LastEditors: Fan Hao * LastEditTime: 2022-06-18 17:15 * Revisions: Rev 0.0 * History: * [2022-06-18]: Initial version. * * Copyright(c) 2022 Beijing Institute of Technology. * Lab of Communication and Networking * ******************************************************************************/ #include #include #include #include "phy_ctrl.h" #include "../error.h" #define ANT_PI 3.14159265358979323846 #define ANT_COINFO_HEAD 0xAA #define ANT_COINFO_TAIL 0xCC #define CTRL_WORD_DEFAULT 0x00 #define ANT_MODE_BEAM_MASK 0xF0 #define ANT_MODE_NARROR_BEAM 0x00 // 8 #define ANT_MODE_WIDE_BEAM_1 0x10 // 25 #define ANT_MODE_WIDE_BEAM_2 0x20 // 60 #define ANT_MODE_WIDE_BEAM_3 0x30 // 120 #define ANT_MODE_HIGH_POWER 0x00 #define ANT_MODE_LOWAPOWER 0x04 #define ANT_MODE_STANDBY 0x0F #define ATN_MODE_DEFAULT (ANT_MODE_WIDE_BEAM_1 | ANT_MODE_LOWAPOWER) #define ATN_MODE_HIGH (ANT_MODE_WIDE_BEAM_1 | ANT_MODE_HIGH_POWER) #define DEFAULT_CENTRTAL_FREQ 0x06D7 // 26.25GHz #define RXTXMODE_RX 0x00 #define RXTXMODE_TX 0x01 #define CALIBRMODE_NORMAL 0x00 #define CALIBRMODE_SINGLE_TR_CAL 0x01 #define MODECTRL_DEFAULT 0x00 uint16_t hopPattern_Config[L1_FRAME_MAX_HOPS] = {0}; uint16_t hopPattern_2KBPS_20MS[L1_FRAME_2KBPS_20MS_HOPS] = {1500}; uint16_t hopPattern_2KBPS_100MS[L1_FRAME_2KBPS_100MS_HOPS] = { 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400 }; uint16_t hopPattern_10KBPS_10MS[L1_FRAME_10KBPS_10MS_HOPS] = {1500}; uint16_t hopPattern_10KBPS_20MS[L1_FRAME_10KBPS_20MS_HOPS] = { 1500, 1600, 1700, 1800, 1900, 2000, 1500, 1600, 1700, 1800, 1900 }; uint16_t hopPattern_40KBPS_10MS[L1_FRAME_40KBPS_10MS_HOPS] = { 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400 }; uint16_t hopPattern_40KBPS_20MS[L1_FRAME_40KBPS_20MS_HOPS] = { 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400 }; uint16_t hopPattern_200KBPS_5MS[L1_FRAME_200KBPS_5MS_HOPS] ={ 1500, 1600, 1700, 1800, 1900, 2000, 1500, 1600 , 1700, 1800, 1900, 2000, 1500, 1600 , 1700, 1800, 1900, 2000, 1500, 1500}; uint16_t hopPattern_1M2BPS_5MS[L1_FRAME_1M2BPS_5MS_HOPS] = { 500, 600, 700, 800, 900, 1000, 500, 600 , 700, 800, 900, 1000, 500, 600 , 700, 800, 900, 1000, 500, 500 }; // Pair by regex // Regex: ((\{\.oaxis = [0-9]+[ ,]+\.raxis = [0-9]+[ ]*\}, ){2}) #if defined(PHY_BEAM_SET_PRESET) ANT_ANGLE antSubnrrwPattern[NUM_ANT_SUBNRRW_PATTERN] = { {.oaxis = 0 , .raxis = 222}, {.oaxis = 10, .raxis = 85 }, {.oaxis = 14, .raxis = 307}, {.oaxis = 17, .raxis = 170}, {.oaxis = 19, .raxis = 32 }, {.oaxis = 21, .raxis = 255}, {.oaxis = 24, .raxis = 117}, {.oaxis = 25, .raxis = 340}, {.oaxis = 27, .raxis = 202}, {.oaxis = 29, .raxis = 65 }, {.oaxis = 31, .raxis = 287}, {.oaxis = 32, .raxis = 150}, {.oaxis = 34, .raxis = 12 }, {.oaxis = 35, .raxis = 235}, {.oaxis = 36, .raxis = 97 }, {.oaxis = 38, .raxis = 320}, {.oaxis = 39, .raxis = 182}, {.oaxis = 40, .raxis = 45 }, {.oaxis = 41, .raxis = 267}, {.oaxis = 43, .raxis = 130}, {.oaxis = 44, .raxis = 352}, {.oaxis = 45, .raxis = 215}, {.oaxis = 46, .raxis = 77 }, {.oaxis = 47, .raxis = 300}, {.oaxis = 48, .raxis = 162}, {.oaxis = 49, .raxis = 25 }, {.oaxis = 50, .raxis = 247}, {.oaxis = 51, .raxis = 110}, {.oaxis = 52, .raxis = 332}, {.oaxis = 53, .raxis = 195}, {.oaxis = 54, .raxis = 57 }, {.oaxis = 55, .raxis = 280}, {.oaxis = 56, .raxis = 142}, {.oaxis = 57, .raxis = 5 }, {.oaxis = 58, .raxis = 227}, {.oaxis = 59, .raxis = 90 }, {.oaxis = 60, .raxis = 312} }; ANT_ANGLE antNrrwPattern[NUM_ANT_NRRW_PATTERN] = { {.oaxis = 0 , .raxis = 222}, {.oaxis = 7 , .raxis = 85 }, {.oaxis = 10, .raxis = 307}, {.oaxis = 13, .raxis = 170}, {.oaxis = 15, .raxis = 32 }, {.oaxis = 17, .raxis = 255}, {.oaxis = 18, .raxis = 117}, {.oaxis = 20, .raxis = 340}, {.oaxis = 21, .raxis = 202}, {.oaxis = 22, .raxis = 65 }, {.oaxis = 24, .raxis = 287}, {.oaxis = 25, .raxis = 150}, {.oaxis = 26, .raxis = 12 }, {.oaxis = 27, .raxis = 235}, {.oaxis = 28, .raxis = 97 }, {.oaxis = 29, .raxis = 320}, {.oaxis = 30, .raxis = 182}, {.oaxis = 31, .raxis = 45 }, {.oaxis = 32, .raxis = 267}, {.oaxis = 33, .raxis = 130}, {.oaxis = 34, .raxis = 352}, {.oaxis = 34, .raxis = 215}, {.oaxis = 35, .raxis = 77 }, {.oaxis = 36, .raxis = 300}, {.oaxis = 37, .raxis = 162}, {.oaxis = 38, .raxis = 25 }, {.oaxis = 38, .raxis = 247}, {.oaxis = 39, .raxis = 110}, {.oaxis = 40, .raxis = 332}, {.oaxis = 41, .raxis = 195}, {.oaxis = 41, .raxis = 57 }, {.oaxis = 42, .raxis = 280}, {.oaxis = 43, .raxis = 142}, {.oaxis = 44, .raxis = 5 }, {.oaxis = 44, .raxis = 227}, {.oaxis = 45, .raxis = 90 }, {.oaxis = 46, .raxis = 312}, {.oaxis = 46, .raxis = 175}, {.oaxis = 47, .raxis = 37 }, {.oaxis = 48, .raxis = 260}, {.oaxis = 48, .raxis = 122}, {.oaxis = 49, .raxis = 345}, {.oaxis = 49, .raxis = 207}, {.oaxis = 50, .raxis = 70 }, {.oaxis = 51, .raxis = 292}, {.oaxis = 51, .raxis = 155}, {.oaxis = 52, .raxis = 17 }, {.oaxis = 53, .raxis = 240}, {.oaxis = 53, .raxis = 102}, {.oaxis = 54, .raxis = 325}, {.oaxis = 54, .raxis = 187}, {.oaxis = 55, .raxis = 50 }, {.oaxis = 55, .raxis = 272}, {.oaxis = 56, .raxis = 135}, {.oaxis = 57, .raxis = 357}, {.oaxis = 57, .raxis = 220}, {.oaxis = 58, .raxis = 82 }, {.oaxis = 58, .raxis = 305}, {.oaxis = 59, .raxis = 167}, {.oaxis = 59, .raxis = 30 }, {.oaxis = 60, .raxis = 252} }; #elif defined(PHY_BEAM_SET_PRESET_LSX) ANT_ANGLE antSubnrrwPattern[NUM_ANT_SUBNRRW_PATTERN] = { {.oaxis = 0 , .raxis =2225},{.oaxis = 96 , .raxis =850 }, {.oaxis = 135, .raxis =3075},{.oaxis = 166, .raxis =1700}, {.oaxis = 192, .raxis =325 },{.oaxis = 215, .raxis =2550}, {.oaxis = 236, .raxis =1174},{.oaxis = 255, .raxis =3399}, {.oaxis = 273, .raxis =2024},{.oaxis = 290, .raxis =649 }, {.oaxis = 306, .raxis =2874},{.oaxis = 321, .raxis =1499}, {.oaxis = 336, .raxis =124 },{.oaxis = 350, .raxis =2349}, {.oaxis = 363, .raxis =974 },{.oaxis = 377, .raxis =3199}, {.oaxis = 389, .raxis =1824},{.oaxis = 402, .raxis =449 }, {.oaxis = 414, .raxis =2674},{.oaxis = 426, .raxis =1298}, {.oaxis = 438, .raxis =3523},{.oaxis = 449, .raxis =2148}, {.oaxis = 460, .raxis =773 },{.oaxis = 471, .raxis =2998}, {.oaxis = 482, .raxis =1623},{.oaxis = 492, .raxis =248 }, {.oaxis = 503, .raxis =2473},{.oaxis = 513, .raxis =1098}, {.oaxis = 523, .raxis =3323},{.oaxis = 533, .raxis =1948}, {.oaxis = 543, .raxis =573 },{.oaxis = 553, .raxis =2798}, {.oaxis = 563, .raxis =1422},{.oaxis = 572, .raxis =47 }, {.oaxis = 581, .raxis =2272},{.oaxis = 591, .raxis =897 }, {.oaxis = 600, .raxis =3122} }; ANT_ANGLE antNrrwPattern[NUM_ANT_NRRW_PATTERN] = { {.oaxis = 0 , .raxis =2225},{.oaxis = 74 , .raxis =850 }, {.oaxis = 105, .raxis =3075},{.oaxis = 128, .raxis =1700}, {.oaxis = 148, .raxis =325 },{.oaxis = 166, .raxis =2550}, {.oaxis = 182, .raxis =1174},{.oaxis = 197, .raxis =3399}, {.oaxis = 210, .raxis =2024},{.oaxis = 223, .raxis =649 }, {.oaxis = 236, .raxis =2874},{.oaxis = 247, .raxis =1499}, {.oaxis = 258, .raxis =124 },{.oaxis = 269, .raxis =2349}, {.oaxis = 280, .raxis =974 },{.oaxis = 290, .raxis =3199}, {.oaxis = 299, .raxis =1824},{.oaxis = 309, .raxis =449 }, {.oaxis = 318, .raxis =2674},{.oaxis = 327, .raxis =1298}, {.oaxis = 336, .raxis =3523},{.oaxis = 344, .raxis =2148}, {.oaxis = 352, .raxis =773 },{.oaxis = 361, .raxis =2998}, {.oaxis = 369, .raxis =1623},{.oaxis = 377, .raxis =248 }, {.oaxis = 384, .raxis =2473},{.oaxis = 392, .raxis =1098}, {.oaxis = 399, .raxis =3323},{.oaxis = 407, .raxis =1948}, {.oaxis = 414, .raxis =573 },{.oaxis = 421, .raxis =2798}, {.oaxis = 428, .raxis =1422},{.oaxis = 435, .raxis =47 }, {.oaxis = 442, .raxis =2272},{.oaxis = 449, .raxis =897 }, {.oaxis = 456, .raxis =3122},{.oaxis = 462, .raxis =1747}, {.oaxis = 469, .raxis =372 },{.oaxis = 475, .raxis =2597}, {.oaxis = 482, .raxis =1222},{.oaxis = 488, .raxis =3447}, {.oaxis = 495, .raxis =2072},{.oaxis = 501, .raxis =697 }, {.oaxis = 507, .raxis =2922},{.oaxis = 513, .raxis =1546}, {.oaxis = 519, .raxis =171 },{.oaxis = 525, .raxis =2396}, {.oaxis = 531, .raxis =1021},{.oaxis = 537, .raxis =3246}, {.oaxis = 543, .raxis =1871},{.oaxis = 549, .raxis =496 }, {.oaxis = 555, .raxis =2721},{.oaxis = 561, .raxis =1346}, {.oaxis = 566, .raxis =3571},{.oaxis = 572, .raxis =2196}, {.oaxis = 578, .raxis =821 },{.oaxis = 583, .raxis =3045}, {.oaxis = 589, .raxis =1670},{.oaxis = 594, .raxis =295 }, {.oaxis = 600, .raxis =2520} }; #else PHY_ANT_ANGLE antSubnrrwPattern[NUM_ANT_SUBNRRW_PATTERN] = {0}; PHY_ANT_ANGLE antNrrwPattern[NUM_ANT_NRRW_PATTERN] = {0}; #endif /*****************************************************************************/ /** * @brief * * @param antCoinfoPtr * * @return * ******************************************************************************/ int32_t Phy_AntCoinfoInit(PHY_ANT_CONFIG *antCoinfoPtr) { if (antCoinfoPtr == NULL) { return FAILURE; } antCoinfoPtr->head = ANT_COINFO_HEAD; antCoinfoPtr->tail = ANT_COINFO_TAIL; antCoinfoPtr->ctrlWord = 0x00; #ifdef ANT_HIGH_POWER antCoinfoPtr->antMode = ATN_MODE_HIGH; #else antCoinfoPtr->antMode = ATN_MODE_DEFAULT; #endif // FIXME: Dummy default value. // off axis angle setting antCoinfoPtr->oaxis[0] = 0; antCoinfoPtr->oaxis[1] = 0; // round axis angle setting antCoinfoPtr->raxis[0] = 0; antCoinfoPtr->raxis[1] = 0; // *********************** antCoinfoPtr->antFreq[0] = (uint8_t)(DEFAULT_CENTRTAL_FREQ); antCoinfoPtr->antFreq[1] = (uint8_t)(DEFAULT_CENTRTAL_FREQ >> 8); // FIXME: Dummy default value. // trSelect antCoinfoPtr->trSlect = 0; // Antenna attenuation setting antCoinfoPtr->antAtt = 20; // phase setting antCoinfoPtr->phase = 0; // *********************** antCoinfoPtr->rxtxMode = RXTXMODE_RX; antCoinfoPtr->calibrMode = CALIBRMODE_NORMAL; // FIXME: Dummy default value. // DD enable antCoinfoPtr->ddEn = 0; // DD mgc antCoinfoPtr->ddMgc = 0; // RF mode control antCoinfoPtr->rfCtrl = 0; // RF MGC control antCoinfoPtr->rfMgc = 0; // RF channel 1&2 calibration mgc antCoinfoPtr->rf12CalMgc = 0; // RF channel 2&3 calibration mgc antCoinfoPtr->rf34CalMgc = 0; // Receive channel 1 MGC antCoinfoPtr->rcv1Mgc = 0; // Receive channel 2 MGC antCoinfoPtr->rcv2Mgc = 0; // Receive channel 3 MGC antCoinfoPtr->rcv3Mgc = 0; // Receive channel 4 MGC antCoinfoPtr->rcv4Mgc = 0; // *********************** memset(antCoinfoPtr->dummy, 0x00, sizeof(antCoinfoPtr->dummy)); return SUCCESS; } int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo) { if(instPtr->beamWd.next == ANT_BEAM_8){ if (beamNo >= NUM_ANT_NRRW_PATTERN) { return FAILURE; } else { instPtr->beamNo.next = beamNo; instPtr->antCoinfoPtr.oaxis[1] = (uint8_t)(antNrrwPattern[beamNo].oaxis); instPtr->antCoinfoPtr.oaxis[0] = (uint8_t)((antNrrwPattern[beamNo].oaxis) >> 8); instPtr->antCoinfoPtr.raxis[1] = (uint8_t)(antNrrwPattern[beamNo].raxis); instPtr->antCoinfoPtr.raxis[0] = (uint8_t)((antNrrwPattern[beamNo].raxis) >> 8); return SUCCESS; } } else if(instPtr->beamWd.next == ANT_BEAM_25){ if (beamNo >= NUM_ANT_SUBNRRW_PATTERN) { return FAILURE; } else { instPtr->beamNo.next = beamNo; instPtr->antCoinfoPtr.oaxis[1] = (uint8_t)(antSubnrrwPattern[beamNo].oaxis); instPtr->antCoinfoPtr.oaxis[0] = (uint8_t)((antSubnrrwPattern[beamNo].oaxis) >> 8); instPtr->antCoinfoPtr.raxis[1] = (uint8_t)(antSubnrrwPattern[beamNo].raxis); instPtr->antCoinfoPtr.raxis[0] = (uint8_t)((antSubnrrwPattern[beamNo].raxis) >> 8); return SUCCESS; } } else{ // Beam number assign not support. // Assign default angle (0,0) instPtr->beamNo.next = 0; instPtr->antCoinfoPtr.oaxis[1] = 0; instPtr->antCoinfoPtr.oaxis[0] = 0; instPtr->antCoinfoPtr.raxis[1] = 0; instPtr->antCoinfoPtr.raxis[0] = 0; DBG_WARNING("Using default beam number..."); return SUCCESS; } } int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth) { uint8_t beamConfig = instPtr->antCoinfoPtr.antMode & (~ANT_MODE_BEAM_MASK); switch (beamWidth) { case ANT_BEAM_120: beamConfig |= ANT_MODE_WIDE_BEAM_3; break; case ANT_BEAM_60: beamConfig |= ANT_MODE_WIDE_BEAM_2; break; case ANT_BEAM_25: beamConfig |= ANT_MODE_WIDE_BEAM_1; break; case ANT_BEAM_8: beamConfig |= ANT_MODE_NARROR_BEAM; break; default: DBG_ERROR("Beam width code: 0x%08X is illegal.\n\r", beamWidth); return EPARAM; break; } instPtr->antCoinfoPtr.antMode = beamConfig; instPtr->beamWd.next = beamWidth; return SUCCESS; } // Common version radius double input int32_t Phy_SetBeamAngle(PHY_INST *instPtr, double offAx, double rndAx) { uint16_t offAxDeg = 0; uint16_t rndAxDeg = 0; offAxDeg = (offAx > 0) ? (((int32_t)(offAx * 180 / ANT_PI)) % 360) : (((int32_t)(offAx * 180 / ANT_PI)) % 360 + 360); rndAxDeg = (rndAx > 0) ? (((int32_t)(rndAx * 180 / ANT_PI)) % 360) : (((int32_t)(rndAx * 180 / ANT_PI)) % 360 + 360); if (offAxDeg > 60) { DBG_ERROR("Angle out of range, off axis angle: %u(should be 0~60), round axis angle: %u(should be 0~360).", offAxDeg, rndAxDeg); return EPARAM; } offAxDeg = offAxDeg * 10; rndAxDeg = rndAxDeg * 10; instPtr->antCoinfoPtr.oaxis[1] = (uint8_t)offAxDeg; instPtr->antCoinfoPtr.oaxis[0] = (uint8_t)(offAxDeg >> 8); instPtr->antCoinfoPtr.raxis[1] = (uint8_t)rndAxDeg; instPtr->antCoinfoPtr.raxis[0] = (uint8_t)(rndAxDeg >> 8); return SUCCESS; }