feat: 更新天线控制逻辑

This commit is contained in:
2025-05-19 14:35:16 +08:00
parent a6aff34dee
commit 0339fd03c3
2 changed files with 130 additions and 101 deletions
@@ -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*/
@@ -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*/