From 0339fd03c3dd89193f180aab8b7a5d4f57c42c33 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Mon, 19 May 2025 14:35:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=A4=A9=E7=BA=BF?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/networking/phy_layer/phy_antenna.c | 178 +++++++++--------- .../src/networking/phy_layer/phy_layer.h | 53 ++++-- 2 files changed, 130 insertions(+), 101 deletions(-) diff --git a/df_datalink_sp/src/networking/phy_layer/phy_antenna.c b/df_datalink_sp/src/networking/phy_layer/phy_antenna.c index be653a7..8aec99e 100644 --- a/df_datalink_sp/src/networking/phy_layer/phy_antenna.c +++ b/df_datalink_sp/src/networking/phy_layer/phy_antenna.c @@ -38,22 +38,10 @@ #define CTRL_WORD_DEFAULT 0x00 -#define ANT_MODE_TX_MASK 0x70 -#define ANT_MODE_RX_MASK 0x0F - -#define ANT_MODE_TX_OFF 0x00 -#define ANT_MODE_TX1 BIT(4) -#define ANT_MODE_TX2 BIT(5) -#define ANT_MODE_TX3 BIT(6) - -#define ANT_MODE_RX_AJ BIT(0) +#define ANT_ENABLE 0x01 +#define ANT_DISABLE 0x00 #define ANT_MODE_RX_NORMAL 0x00 - -#define ANT_MODE_RX_AJ1 (BIT(1) | ANT_MODE_RX_AJ) -#define ANT_MODE_RX_AJ2 (BIT(2) | ANT_MODE_RX_AJ) -#define ANT_MODE_RX_AJ3 (BIT(3) | ANT_MODE_RX_AJ) - -#define ATN_MODE_DEFAULT (ANT_MODE_TX_OFF | ANT_MODE_RX_NORMAL) +#define ANT_MODE_RX_AJ 0x01 #define DEFAULT_CENTRTAL_FREQ 300U // 4 GHz @@ -265,8 +253,6 @@ void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig) { ASSERT(antConfig != NULL); - antConfig->rfMode = ATN_MODE_DEFAULT; - // FIXME: Dummy default value. for (uint8_t ii = 0; ii < L1_ANT_NUM; ii ++) { @@ -285,80 +271,108 @@ void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig) 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 Update antenna power mode setting + * @brief Set tx antenna index * - * @param instPtr pointer to physical layer instance - * @param mode new antenna mode + * @param instPtr pointer to physical layer instance + * @param antTxIndex target tx antenna index * * @return None. * ******************************************************************************/ -void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode) +void Phy_SetTxAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antIndex) { ASSERT(instPtr != NULL); - uint8_t config = instPtr->antConfig.rfMode; - size_t antIndexCurr = Phy_GetCurrentAntIndex(instPtr); - switch (mode) + + switch (antIndex) { - case PHY_ANT_MODE_STANDBY: - config &= ~ANT_MODE_TX_MASK; - config |= ANT_MODE_TX_OFF; + 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_MODE_NORMAL: - config &= ~(ANT_MODE_TX_MASK | ANT_MODE_RX_MASK); - config |= ANT_MODE_RX_NORMAL; - - switch (antIndexCurr) - { - case 0: - config |= ANT_MODE_TX1; - break; - case 1: - config |= ANT_MODE_TX2; - break; - case 2: - config |= ANT_MODE_TX3; - break; - default: - config |= ANT_MODE_TX_OFF; - DBG_WARNING("Unknown tx antenna number: %" PRIu8 ", tx is off.\n", antIndexCurr); - 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_MODE_ANTI_JAM: - config &= ~(ANT_MODE_TX_MASK | ANT_MODE_RX_MASK); - - switch (antIndexCurr) - { - case 0: - config |= ANT_MODE_TX1; - config |= ANT_MODE_RX_AJ1; - break; - case 1: - config |= ANT_MODE_TX2; - config |= ANT_MODE_RX_AJ2; - break; - case 2: - config |= ANT_MODE_TX3; - config |= ANT_MODE_RX_AJ3; - break; - default: - config |= ANT_MODE_TX_OFF; - config |= ANT_MODE_RX_NORMAL; - DBG_WARNING("Unknown tx antenna number: %" PRIu8 ", remain normal mode.\n", antIndexCurr); - 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: - DBG_ERROR("Unknown antenna mode: %" PRIu8 ", remain previous mode.\n", mode); - return; + instPtr->antConfig.antControl.antTx1En = ANT_DISABLE; + instPtr->antConfig.antControl.antTx2En = ANT_DISABLE; + instPtr->antConfig.antControl.antTx3En = ANT_DISABLE; + break; } - instPtr->phyLog.rfMode = mode; - instPtr->antConfig.rfMode = config; +} + +/*****************************************************************************/ +/** + * @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); + + 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; + } +} + +/*****************************************************************************/ +/** + * @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)); } @@ -374,7 +388,7 @@ void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode) * EPARAM - antenna index exceeds predefined range * ******************************************************************************/ -int32_t Phy_SetAntIndex(PHY_INST *instPtr, size_t antIndex) +int32_t Phy_SetAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antIndex) { ASSERT(instPtr != NULL); @@ -385,20 +399,13 @@ int32_t Phy_SetAntIndex(PHY_INST *instPtr, size_t antIndex) } DBG_INFO("Set new antenna index: %" PRId8 "\n", antIndex); instPtr->antIndex.next = antIndex; + Phy_SetTxAntIndex(instPtr, antIndex); + Phy_SetRxAntIndex(instPtr, antIndex); return SUCCESS; } /** - * @brief Get next antenna index. - */ -inline size_t Phy_GetCurrentAntIndex(PHY_INST *instPtr) -{ - ASSERT(instPtr != NULL); - return instPtr->antIndex.curr; -} - -/** - * @brief Get current antenna index. + * @brief Get antenna index of the next slot. */ inline size_t Phy_GetNextAntIndex(PHY_INST *instPtr) { @@ -406,7 +413,6 @@ inline size_t Phy_GetNextAntIndex(PHY_INST *instPtr) return instPtr->antIndex.next; } - /** @} PhysicalLayer_AntennaControl*/ /** @} PhysicalLayer*/ \ No newline at end of file diff --git a/df_datalink_sp/src/networking/phy_layer/phy_layer.h b/df_datalink_sp/src/networking/phy_layer/phy_layer.h index 102c759..3383446 100644 --- a/df_datalink_sp/src/networking/phy_layer/phy_layer.h +++ b/df_datalink_sp/src/networking/phy_layer/phy_layer.h @@ -80,16 +80,19 @@ typedef struct uint8_t rfNormComAttn[L1_ANT_NUM]; ///< Normal mode RF attenuation for combined channel: /// 0~30 dB, 1dB step - uint8_t rfMode; ///< Mode control: - /// [7]: reserved - /// [6]: Antenna 3 tx control, 1 - enable, 0 - disable - /// [5]: Antenna 2 tx control, 1 - enable, 0 - disable - /// [4]: Antenna 1 tx control, 1 - enable, 0 - disable - /// [3]: Anti-jamming antenna 3 select, 1 - enable, 0 - disable - /// [2]: Anti-jamming antenna 2 select, 1 - enable, 0 - disable - /// [1]: Anti-jamming antenna 1 select, 1 - enable, 0 - disable - /// only one antenna can be selected in anti-jamming mode - /// [0]: Anti-jamming mode control, 1 - enable, 0 - disable + struct + { + uint8_t antMode : 1; /// [0]: Anti-jamming mode control, 1 - enable, 0 - disable + /// only one antenna can be selected in anti-jamming mode + uint8_t antRx1En : 1; /// [1]: Anti-jamming antenna 1 select, 1 - enable, 0 - disable + uint8_t antRx2En : 1; /// [2]: Anti-jamming antenna 2 select, 1 - enable, 0 - disable + uint8_t antRx3En : 1; /// [3]: Anti-jamming antenna 3 select, 1 - enable, 0 - disable + uint8_t antTx1En : 1; /// [4]: Antenna 1 tx control, 1 - enable, 0 - disable + uint8_t antTx2En : 1; /// [5]: Antenna 2 tx control, 1 - enable, 0 - disable + uint8_t antTx3En : 1; /// [6]: Antenna 3 tx control, 1 - enable, 0 - disable + uint8_t antRsvd : 1; /// [7]: reserved + } antControl; + uint8_t rfAntiAttn[L1_ANT_CH_NUM]; ///< Anti-jamming mode RF attenuation, 4 channels: /// 0~60 dB, 1dB step @@ -141,6 +144,26 @@ typedef enum PHY_ANT_MODE_ANTI_JAM = 3 } PHY_ANT_MODE; +/** + * @enum PHY_ANT_RX_MODE + */ +typedef enum +{ + PHY_ANT_RX_MODE_NORMAL = 0, + PHY_ANT_RX_MODE_AJ = 1 +} PHY_ANT_RX_MODE; + +/** + * @enum PHY_ANT_INDEX + */ +typedef enum +{ + PHY_ANT_INDEX_NONE = 0, + PHY_ANT_INDEX_1 = 1, + PHY_ANT_INDEX_2 = 2, + PHY_ANT_INDEX_3 = 3 +} PHY_ANT_INDEX; + /** * @struct PHY_RCD * @brief Physical Layer recode buffer @@ -189,7 +212,7 @@ typedef struct bool isValid; ///< indicates if last reception frame data valid (crc check pass) TIME_WORD recvSlotTime; ///< last slot start time stamp TIME_WORD recvFsTime; ///< last frame sync time stamp - PHY_RCD antIndex; ///< antenna number record + PHY_RCD antIndex; ///< antenna number record PHY_RCD tor; ///< tx rx state record PHY_RCD frameType; ///< frame type record uint32_t sendDataOffset; ///< antenna configuration bram offset (to implement ping-pong data flow) @@ -198,7 +221,6 @@ typedef struct #ifndef EMULATION XAdcPs hwXadc; ///< hardware Xadc instance #endif - PHY_ANT_ANGLE antNrrwPattern[L1_ANT_PATTERN_NUM]; ///< antenna beam scan pattern HWSTATE hwSate; ///< hardware state log PHYLOG phyLog; ///< physical state log uint32_t lastLogTime; /// physical state log time stamp @@ -258,9 +280,10 @@ void Phy_GetLastReceivedSlotStartTimeStamp(PHY_INST *instPtr, TIME_WORD *slotSta * @{ */ void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig); -void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode); -int32_t Phy_SetAntIndex(PHY_INST *instPtr, size_t antIndex); -size_t Phy_GetCurrentAntIndex(PHY_INST *instPtr); +void Phy_SetTxAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antIndex); +void Phy_SetRxAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antRxIndex); +void Phy_SetRxMode(PHY_INST *instPtr, PHY_ANT_RX_MODE antRxMode); +int32_t Phy_SetAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antIndex); size_t Phy_GetNextAntIndex(PHY_INST *instPtr); /** @} PhysicalLayer_AntennaControl*/