/*****************************************************************************/ /** * @file phy_antenna.h * @author FanHao (hao_fan_bit_ee@163.com) * @brief Physical layer control antenna configuration functions. * @version 0.0 * @date 2023-04-24 * * @copyright Copyright(c) 2024 Beijing Institute of Technology.\n * Lab of Communication and Network * ******************************************************************************/ /** * @addtogroup PhysicalLayer * @{ */ /** * @addtogroup PhysicalLayer_AntennaControl * @{ */ #include #include #include #include "error.h" #include "phy_layer.h" /** * @name PhysicalLayer_AntennaConfig_Constants * @{ */ #define ANT_PI 3.14159265358979323846 #define ANT_COINFO_HEAD 0xAA #define ANT_COINFO_TAIL 0xCC #define CTRL_WORD_DEFAULT 0x00 #define ANT_ENABLE 0x01 #define ANT_DISABLE 0x00 #define ANT_MODE_RX_NORMAL 0x00 #define ANT_MODE_RX_AJ 0x01 #define DEFAULT_CENTRTAL_FREQ 300U // 4 GHz // Pair by regex // Regex: (([0-9]+, ){8}) const uint16_t freqTable[L1_FRAME_MAX_HOPS] = { 0U, 7U, 15U, 22U, 30U, 37U, 45U, 52U, 60U, 67U, 75U, 82U, 90U, 97U, 105U, 112U, 120U, 127U, 135U, 142U, 150U, 157U, 165U, 172U, 180U, 187U, 195U, 202U, 210U, 217U, 225U, 232U, 240U, 247U, 255U, 262U, 270U, 277U, 285U, 292U, 300U, 307U, 315U, 322U, 330U, 337U, 345U, 352U, 360U, 367U, 375U, 382U, 390U, 397U, 405U, 412U, 420U, 427U, 435U, 442U, 450U, 457U, 465U, 472U, 480U, 487U, 495U, 502U, 510U, 517U, 525U, 532U, 540U, 547U, 555U, 562U, 570U, 577U, 585U, 592U, 600U, }; // const uint8_t antCalTable[L1_ANT_NUM][L1_FRAME_MAX_HOPS][L1_ANT_CH_NUM] = // //Antenna-JG01 // { // // Antenna-1 // { // { 0, 2525, -7533, -6846}, { 0, 12726, -7818, -6860}, // { 0, 2490, -7836, -6907}, { 0, 4479, -7716, -6837}, // { 0, 6409, -7770, -6776}, { 0, 14616, -7977, -6816}, // { 0, -22557, -8002, -6911}, { 0, -22587, -8121, -6918}, // { 0, -1124, -8123, -7030}, { 0, -152, -8219, -7042}, // { 0, 1823, -8209, -7130}, { 0, 1790, -8290, -7214}, // { 0, 1669, -8362, -7283}, { 0, 1634, -8459, -7276}, // { 0, 1615, -8315, -7415}, { 0, 1698, -8168, -7366}, // { 0, 1535, -8285, -7520}, { 0, 1619, -8285, -7532}, // { 0, 1609, -8201, -7693}, { 0, 1671, -8145, -7769}, // { 0, 1676, -8135, -7805}, { 0, 951, -10279, -8871}, // { 0, 976, -10235, -8978}, { 0, 1118, -10127, -9019}, // { 0, 1175, -10003, -9007}, { 0, 1386, -9847, -9039}, // { 0, 1535, -9572, -9058}, { 0, 1729, -9493, -9006}, // { 0, -1158, -9312, -9003}, { 0, 23771, -9147, -8928}, // { 0, 20733, -9074, -8924}, { 0, 2455, -8841, -8886}, // { 0, 2622, -8718, -8735}, { 0, 2791, -8615, -8705}, // { 0, 2861, -8168, -8331}, { 0, 3076, -8091, -8218}, // { 0, 3257, -8046, -8100}, { 0, 3331, -7923, -8073}, // { 0, 3396, -7826, -7994}, { 0, 3478, -7842, -8016}, // { 0, 3518, -7846, -7765}, { 0, 3585, -7753, -7715}, // { 0, 150, -8145, -8591}, { 0, 192, -8090, -8570}, // { 0, 207, -8150, -8597}, { 0, 178, -8142, -8656}, // { 0, 89, -8557, -8688}, { 0, 107, -8614, -8733}, // { 0, 194, -8605, -8782}, { 0, 153, -8655, -8881}, // { 0, 70, -8615, -8952}, { 0, 35, -8596, -9148}, // { 0, 49, -8636, -9286}, { 0, 6, -8587, -9435}, // { 0, -51, -8540, -9549}, { 0, -65, -8588, -9700}, // { 0, -55, -8503, -9820}, { 0, -20, -8414, -9907}, // { 0, -112, -8481, -10031}, { 0, -69, -8535, -10185}, // { 0, 2, -8550, -10052}, { 0, -1, -8493, -10291}, // { 0, -73, -8441, -10380}, { 0, 1958, -6930, -8295}, // { 0, -1148, -6939, -8396}, { 0, 1915, -6784, -8370}, // { 0, 1871, -6970, -8514}, { 0, 1821, -6974, -8387}, // { 0, 1781, -6906, -8431}, { 0, 1736, -6897, -8462}, // { 0, 1664, -7024, -8377}, { 0, 1629, -7127, -8436}, // { 0, 1603, -7148, -8528}, { 0, 1577, -7198, -8500}, // { 0, 1528, -7311, -8512}, { 0, 1577, -7390, -8570}, // { 0, 1616, -7436, -8572}, { 0, 1589, -7597, -8590}, // { 0, 1722, -7550, -8568}, { 0, 1741, -7691, -8449}, // { 0, 1767, -7775, -8328}, // }, // // Antenna-2 // { // { 0, 2525, -7533, -6846}, { 0, 12726, -7818, -6860}, // { 0, 2490, -7836, -6907}, { 0, 4479, -7716, -6837}, // { 0, 6409, -7770, -6776}, { 0, 14616, -7977, -6816}, // { 0, -22557, -8002, -6911}, { 0, -22587, -8121, -6918}, // { 0, -1124, -8123, -7030}, { 0, -152, -8219, -7042}, // { 0, 1823, -8209, -7130}, { 0, 1790, -8290, -7214}, // { 0, 1669, -8362, -7283}, { 0, 1634, -8459, -7276}, // { 0, 1615, -8315, -7415}, { 0, 1698, -8168, -7366}, // { 0, 1535, -8285, -7520}, { 0, 1619, -8285, -7532}, // { 0, 1609, -8201, -7693}, { 0, 1671, -8145, -7769}, // { 0, 1676, -8135, -7805}, { 0, 951, -10279, -8871}, // { 0, 976, -10235, -8978}, { 0, 1118, -10127, -9019}, // { 0, 1175, -10003, -9007}, { 0, 1386, -9847, -9039}, // { 0, 1535, -9572, -9058}, { 0, 1729, -9493, -9006}, // { 0, -1158, -9312, -9003}, { 0, 23771, -9147, -8928}, // { 0, 20733, -9074, -8924}, { 0, 2455, -8841, -8886}, // { 0, 2622, -8718, -8735}, { 0, 2791, -8615, -8705}, // { 0, 2861, -8168, -8331}, { 0, 3076, -8091, -8218}, // { 0, 3257, -8046, -8100}, { 0, 3331, -7923, -8073}, // { 0, 3396, -7826, -7994}, { 0, 3478, -7842, -8016}, // { 0, 3518, -7846, -7765}, { 0, 3585, -7753, -7715}, // { 0, 150, -8145, -8591}, { 0, 192, -8090, -8570}, // { 0, 207, -8150, -8597}, { 0, 178, -8142, -8656}, // { 0, 89, -8557, -8688}, { 0, 107, -8614, -8733}, // { 0, 194, -8605, -8782}, { 0, 153, -8655, -8881}, // { 0, 70, -8615, -8952}, { 0, 35, -8596, -9148}, // { 0, 49, -8636, -9286}, { 0, 6, -8587, -9435}, // { 0, -51, -8540, -9549}, { 0, -65, -8588, -9700}, // { 0, -55, -8503, -9820}, { 0, -20, -8414, -9907}, // { 0, -112, -8481, -10031}, { 0, -69, -8535, -10185}, // { 0, 2, -8550, -10052}, { 0, -1, -8493, -10291}, // { 0, -73, -8441, -10380}, { 0, 1958, -6930, -8295}, // { 0, -1148, -6939, -8396}, { 0, 1915, -6784, -8370}, // { 0, 1871, -6970, -8514}, { 0, 1821, -6974, -8387}, // { 0, 1781, -6906, -8431}, { 0, 1736, -6897, -8462}, // { 0, 1664, -7024, -8377}, { 0, 1629, -7127, -8436}, // { 0, 1603, -7148, -8528}, { 0, 1577, -7198, -8500}, // { 0, 1528, -7311, -8512}, { 0, 1577, -7390, -8570}, // { 0, 1616, -7436, -8572}, { 0, 1589, -7597, -8590}, // { 0, 1722, -7550, -8568}, { 0, 1741, -7691, -8449}, // { 0, 1767, -7775, -8328}, // }, // // Antenna-3 // { // { 0, 2525, -7533, -6846}, { 0, 12726, -7818, -6860}, // { 0, 2490, -7836, -6907}, { 0, 4479, -7716, -6837}, // { 0, 6409, -7770, -6776}, { 0, 14616, -7977, -6816}, // { 0, -22557, -8002, -6911}, { 0, -22587, -8121, -6918}, // { 0, -1124, -8123, -7030}, { 0, -152, -8219, -7042}, // { 0, 1823, -8209, -7130}, { 0, 1790, -8290, -7214}, // { 0, 1669, -8362, -7283}, { 0, 1634, -8459, -7276}, // { 0, 1615, -8315, -7415}, { 0, 1698, -8168, -7366}, // { 0, 1535, -8285, -7520}, { 0, 1619, -8285, -7532}, // { 0, 1609, -8201, -7693}, { 0, 1671, -8145, -7769}, // { 0, 1676, -8135, -7805}, { 0, 951, -10279, -8871}, // { 0, 976, -10235, -8978}, { 0, 1118, -10127, -9019}, // { 0, 1175, -10003, -9007}, { 0, 1386, -9847, -9039}, // { 0, 1535, -9572, -9058}, { 0, 1729, -9493, -9006}, // { 0, -1158, -9312, -9003}, { 0, 23771, -9147, -8928}, // { 0, 20733, -9074, -8924}, { 0, 2455, -8841, -8886}, // { 0, 2622, -8718, -8735}, { 0, 2791, -8615, -8705}, // { 0, 2861, -8168, -8331}, { 0, 3076, -8091, -8218}, // { 0, 3257, -8046, -8100}, { 0, 3331, -7923, -8073}, // { 0, 3396, -7826, -7994}, { 0, 3478, -7842, -8016}, // { 0, 3518, -7846, -7765}, { 0, 3585, -7753, -7715}, // { 0, 150, -8145, -8591}, { 0, 192, -8090, -8570}, // { 0, 207, -8150, -8597}, { 0, 178, -8142, -8656}, // { 0, 89, -8557, -8688}, { 0, 107, -8614, -8733}, // { 0, 194, -8605, -8782}, { 0, 153, -8655, -8881}, // { 0, 70, -8615, -8952}, { 0, 35, -8596, -9148}, // { 0, 49, -8636, -9286}, { 0, 6, -8587, -9435}, // { 0, -51, -8540, -9549}, { 0, -65, -8588, -9700}, // { 0, -55, -8503, -9820}, { 0, -20, -8414, -9907}, // { 0, -112, -8481, -10031}, { 0, -69, -8535, -10185}, // { 0, 2, -8550, -10052}, { 0, -1, -8493, -10291}, // { 0, -73, -8441, -10380}, { 0, 1958, -6930, -8295}, // { 0, -1148, -6939, -8396}, { 0, 1915, -6784, -8370}, // { 0, 1871, -6970, -8514}, { 0, 1821, -6974, -8387}, // { 0, 1781, -6906, -8431}, { 0, 1736, -6897, -8462}, // { 0, 1664, -7024, -8377}, { 0, 1629, -7127, -8436}, // { 0, 1603, -7148, -8528}, { 0, 1577, -7198, -8500}, // { 0, 1528, -7311, -8512}, { 0, 1577, -7390, -8570}, // { 0, 1616, -7436, -8572}, { 0, 1589, -7597, -8590}, // { 0, 1722, -7550, -8568}, { 0, 1741, -7691, -8449}, // { 0, 1767, -7775, -8328}, // }, // }; const uint8_t hopPattern_ADV_24MS[L1_FRAME_ADV_24MS_HOPS] = { 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, }; const uint8_t hopPattern_ACK_8MS[L1_FRAME_ACK_8MS_HOPS] = { 10U, 11U, 12U, 13U, 14U, }; //const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] = //{ // 80U, 16U, 17U, 65U, 60U, 54U, 31U, 15U, // 6U, 19U, 79U, 52U, 29U, 42U, 23U, 59U, // 60U, 58U, 76U, 67U, 31U, 76U, 77U, 79U, // 79U, 14U, 61U, 5U, 71U, 50U, 32U, 77U, // 60U, //}; //const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] = //{ // 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, // 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, // 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U, // 24U, 25U, 26U, 27U, 28U, 29U, 30U, 31U, // 32U, //}; const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] = { 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 10U, 11U, 10U, 11U, 10U, 11U, 10U, 12U, 10U, 12U, 10U, 12U, 10U, 12U, 10U, 13U, 10U, 13U, 10U, 13U, 10U, 13U, 10U, }; //const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] = //{ // 0U, 1U, 2U, 3U, 4U, 5U, 6U, //}; //const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] = //{ // 0U, 16U, 17U, 65U, 60U, 54U, 31U, 15U, // 6U, 19U, 39U, 52U, 29U, 42U, 23U, 49U, // 33U, 58U, 24U, 67U, 31U, 13U, 17U, 10U, // 59U, 14U, 61U, 5U, 41U, 44U, 32U, 35U, // 60U, //}; //const uint8_t hopPattern_512KBPS_4MS[L1_FRAME_512KBPS_4MS_HOPS] = //{ // 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, // 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U, // 24U, 25U, 26U, 27U, 28U, 29U, 30U, 31U, // 32U, 33U, 34U, 35U, 36U, 37U, 38U, 39U, // 40U, 41U, 42U, 43U, //}; const uint8_t hopPattern_512KBPS_4MS[L1_FRAME_512KBPS_4MS_HOPS] = { 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 16U, 17U, 16U, 17U, 16U, 17U, 16U, 18U, 16U, 18U, 16U, 18U, 16U, 18U, 16U, 19U, 16U, 19U, 16U, 19U, 16U, 19U, 16U, 20U, 16U, 20U, }; //const uint8_t hopPattern_2MBPS_4MS[L1_FRAME_2MBPS_4MS_HOPS] = //{ // 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U, // 24U, 25U, 26U, 27U, 28U, 29U, 30U, 31U, // 32U, 33U, 34U, 35U, 36U, 37U, 38U, 39U, // 40U, 41U, 42U, 43U, 44U, 45U, 46U, 47U, // 48U, 49U, 50U, 51U, 52U, 53U, //}; //const uint8_t hopPattern_2MBPS_4MS[L1_FRAME_2MBPS_4MS_HOPS] = //{ // 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U, // 24U, 25U, 24U, 25U, 24U, 25U, 24U, 25U, // 24U, 26U, 24U, 26U, 24U, 26U, 24U, 26U, // 24U, 27U, 24U, 27U, 24U, 27U, 24U, 27U, // 24U, 28U, 24U, 28U, 24U, 28U, //}; const uint8_t hopPattern_2MBPS_4MS[L1_FRAME_2MBPS_4MS_HOPS] = { 16U, 17U, 18U, 19U, 20U, 21U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U, }; /** @} PhysicalLayer_AntennaConfig_Constants*/ /*****************************************************************************/ /** * @brief Initialize antenna configurations (load preset values) * * @param antConfig pointer to antenna configure * * @return None. * ******************************************************************************/ void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig) { ASSERT(antConfig != NULL); // FIXME: Dummy default value. for (uint8_t ii = 0; ii < L1_ANT_NUM; ii ++) { for (uint8_t jj = 0; jj < L1_ANT_CH_NUM; jj ++) { antConfig->rfNormComp[ii][jj] = 0; antConfig->rfNormIdpAttn[ii][jj] = 0; } antConfig->rfNormComAttn[ii] = 0; antConfig->rfFreq[ii][0] = (uint8_t)(DEFAULT_CENTRTAL_FREQ); antConfig->rfFreq[ii][1] = (uint8_t)(DEFAULT_CENTRTAL_FREQ >> 8); } for (uint8_t ii = 0; ii < L1_ANT_CH_NUM; ii ++) { antConfig->rfAntiAttn[ii] = 0; } antConfig->antControl.antMode = ANT_MODE_RX_NORMAL; antConfig->antControl.antRx1En = ANT_DISABLE; antConfig->antControl.antRx2En = ANT_DISABLE; antConfig->antControl.antRx3En = ANT_DISABLE; antConfig->antControl.antTx1En = ANT_DISABLE; antConfig->antControl.antTx2En = ANT_DISABLE; antConfig->antControl.antTx3En = ANT_DISABLE; } /*****************************************************************************/ /** * @brief Set tx antenna index * * @param instPtr pointer to physical layer instance * @param antTxIndex target tx antenna index * * @return None. * ******************************************************************************/ void Phy_SetTxAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antIndex) { ASSERT(instPtr != NULL); switch (antIndex) { case PHY_ANT_INDEX_1: instPtr->antConfig.antControl.antTx1En = ANT_ENABLE; instPtr->antConfig.antControl.antTx2En = ANT_DISABLE; instPtr->antConfig.antControl.antTx3En = ANT_DISABLE; break; case PHY_ANT_INDEX_2: instPtr->antConfig.antControl.antTx1En = ANT_DISABLE; instPtr->antConfig.antControl.antTx2En = ANT_ENABLE; instPtr->antConfig.antControl.antTx3En = ANT_DISABLE; break; case PHY_ANT_INDEX_3: instPtr->antConfig.antControl.antTx1En = ANT_DISABLE; instPtr->antConfig.antControl.antTx2En = ANT_DISABLE; instPtr->antConfig.antControl.antTx3En = ANT_ENABLE; break; default: instPtr->antConfig.antControl.antTx1En = ANT_DISABLE; instPtr->antConfig.antControl.antTx2En = ANT_DISABLE; instPtr->antConfig.antControl.antTx3En = ANT_DISABLE; break; } } /*****************************************************************************/ /** * @brief Set rx antenna index * * @param instPtr pointer to physical layer instance * @param antRxIndex target rx antenna index * * @return None. * ******************************************************************************/ void Phy_SetRxAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antRxIndex) { ASSERT(instPtr != NULL); if (instPtr->antConfig.antControl.antMode == ANT_MODE_RX_AJ) { switch (antRxIndex) { case PHY_ANT_INDEX_1: instPtr->antConfig.antControl.antRx1En = ANT_ENABLE; instPtr->antConfig.antControl.antRx2En = ANT_DISABLE; instPtr->antConfig.antControl.antRx3En = ANT_DISABLE; break; case PHY_ANT_INDEX_2: instPtr->antConfig.antControl.antRx1En = ANT_DISABLE; instPtr->antConfig.antControl.antRx2En = ANT_ENABLE; instPtr->antConfig.antControl.antRx3En = ANT_DISABLE; break; case PHY_ANT_INDEX_3: instPtr->antConfig.antControl.antRx1En = ANT_DISABLE; instPtr->antConfig.antControl.antRx2En = ANT_DISABLE; instPtr->antConfig.antControl.antRx3En = ANT_ENABLE; break; default: instPtr->antConfig.antControl.antRx1En = ANT_DISABLE; instPtr->antConfig.antControl.antRx2En = ANT_DISABLE; instPtr->antConfig.antControl.antRx3En = ANT_DISABLE; break; } } else { instPtr->antConfig.antControl.antRx1En = ANT_DISABLE; instPtr->antConfig.antControl.antRx2En = ANT_DISABLE; instPtr->antConfig.antControl.antRx3En = ANT_DISABLE; } } /*****************************************************************************/ /** * @brief Set rx mode to normal or anti-jamming. * * @param instPtr pointer to physical layer instance * @param antRxMode target rx mode * * @return None. * ******************************************************************************/ void Phy_SetRxMode(PHY_INST *instPtr, PHY_ANT_RX_MODE antRxMode) { ASSERT(instPtr != NULL); instPtr->antConfig.antControl.antMode = antRxMode; // Sync logs to system monitor SysMonitor_UpdatePhysicalLayerLog(&(instPtr->phyLog)); } /*****************************************************************************/ /** * @brief Update antenna index of the next slot. * * @param instPtr pointer to physical layer instance * @param AntIndex antenna index * * @return SUCCESS. * EPARAM - antenna index exceeds predefined range * ******************************************************************************/ int32_t Phy_SetAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antIndex) { ASSERT(instPtr != NULL); if (antIndex < 0 || antIndex >= L1_ANT_NUM) { DBG_ERROR("Antenna index out of range: %" PRIu8 ". \n", antIndex); return EPARAM; } DBG_INFO("Set new antenna index: %" PRId8 "\n", antIndex); Phy_SetTxAntIndex(instPtr, antIndex); Phy_SetRxAntIndex(instPtr, antIndex); instPtr->antIndex.last = instPtr->antIndex.curr; instPtr->antIndex.curr = instPtr->antIndex.next; instPtr->antIndex.next = antIndex; return SUCCESS; } /** * @brief Get antenna index of the next slot. */ inline size_t Phy_GetNextAntIndex(PHY_INST *instPtr) { ASSERT(instPtr != NULL); return instPtr->antIndex.next; } /** @} PhysicalLayer_AntennaControl*/ /** @} PhysicalLayer*/