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 CTRL_WORD_DEFAULT 0x00
#define ANT_MODE_TX_MASK 0x70 #define ANT_ENABLE 0x01
#define ANT_MODE_RX_MASK 0x0F #define ANT_DISABLE 0x00
#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_MODE_RX_NORMAL 0x00 #define ANT_MODE_RX_NORMAL 0x00
#define ANT_MODE_RX_AJ 0x01
#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 DEFAULT_CENTRTAL_FREQ 300U // 4 GHz #define DEFAULT_CENTRTAL_FREQ 300U // 4 GHz
@@ -265,8 +253,6 @@ void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig)
{ {
ASSERT(antConfig != NULL); ASSERT(antConfig != NULL);
antConfig->rfMode = ATN_MODE_DEFAULT;
// FIXME: Dummy default value. // FIXME: Dummy default value.
for (uint8_t ii = 0; ii < L1_ANT_NUM; ii ++) 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->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 instPtr pointer to physical layer instance
* @param mode new antenna mode * @param antTxIndex target tx antenna index
* *
* @return None. * @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); ASSERT(instPtr != NULL);
uint8_t config = instPtr->antConfig.rfMode;
size_t antIndexCurr = Phy_GetCurrentAntIndex(instPtr);
switch (mode)
{
case PHY_ANT_MODE_STANDBY:
config &= ~ANT_MODE_TX_MASK;
config |= ANT_MODE_TX_OFF;
break;
case PHY_ANT_MODE_NORMAL:
config &= ~(ANT_MODE_TX_MASK | ANT_MODE_RX_MASK);
config |= ANT_MODE_RX_NORMAL;
switch (antIndexCurr) switch (antIndex)
{ {
case 0: case PHY_ANT_INDEX_1:
config |= ANT_MODE_TX1; instPtr->antConfig.antControl.antTx1En = ANT_ENABLE;
instPtr->antConfig.antControl.antTx2En = ANT_DISABLE;
instPtr->antConfig.antControl.antTx3En = ANT_DISABLE;
break; break;
case 1: case PHY_ANT_INDEX_2:
config |= ANT_MODE_TX2; instPtr->antConfig.antControl.antTx1En = ANT_DISABLE;
instPtr->antConfig.antControl.antTx2En = ANT_ENABLE;
instPtr->antConfig.antControl.antTx3En = ANT_DISABLE;
break; break;
case 2: case PHY_ANT_INDEX_3:
config |= ANT_MODE_TX3; instPtr->antConfig.antControl.antTx1En = ANT_DISABLE;
instPtr->antConfig.antControl.antTx2En = ANT_DISABLE;
instPtr->antConfig.antControl.antTx3En = ANT_ENABLE;
break; break;
default: default:
config |= ANT_MODE_TX_OFF; instPtr->antConfig.antControl.antTx1En = ANT_DISABLE;
DBG_WARNING("Unknown tx antenna number: %" PRIu8 ", tx is off.\n", antIndexCurr); instPtr->antConfig.antControl.antTx2En = ANT_DISABLE;
instPtr->antConfig.antControl.antTx3En = ANT_DISABLE;
break; break;
} }
break; }
case PHY_ANT_MODE_ANTI_JAM:
config &= ~(ANT_MODE_TX_MASK | ANT_MODE_RX_MASK);
switch (antIndexCurr) /*****************************************************************************/
/**
* @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)
{ {
case 0: ASSERT(instPtr != NULL);
config |= ANT_MODE_TX1;
config |= ANT_MODE_RX_AJ1; 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; break;
case 1: case PHY_ANT_INDEX_2:
config |= ANT_MODE_TX2; instPtr->antConfig.antControl.antRx1En = ANT_DISABLE;
config |= ANT_MODE_RX_AJ2; instPtr->antConfig.antControl.antRx2En = ANT_ENABLE;
instPtr->antConfig.antControl.antRx3En = ANT_DISABLE;
break; break;
case 2: case PHY_ANT_INDEX_3:
config |= ANT_MODE_TX3; instPtr->antConfig.antControl.antRx1En = ANT_DISABLE;
config |= ANT_MODE_RX_AJ3; instPtr->antConfig.antControl.antRx2En = ANT_DISABLE;
instPtr->antConfig.antControl.antRx3En = ANT_ENABLE;
break; break;
default: default:
config |= ANT_MODE_TX_OFF; instPtr->antConfig.antControl.antRx1En = ANT_DISABLE;
config |= ANT_MODE_RX_NORMAL; instPtr->antConfig.antControl.antRx2En = ANT_DISABLE;
DBG_WARNING("Unknown tx antenna number: %" PRIu8 ", remain normal mode.\n", antIndexCurr); instPtr->antConfig.antControl.antRx3En = ANT_DISABLE;
break; break;
} }
break;
default:
DBG_ERROR("Unknown antenna mode: %" PRIu8 ", remain previous mode.\n", mode);
return;
} }
instPtr->phyLog.rfMode = mode;
instPtr->antConfig.rfMode = config; /*****************************************************************************/
/**
* @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 // Sync logs to system monitor
SysMonitor_UpdatePhysicalLayerLog(&(instPtr->phyLog)); SysMonitor_UpdatePhysicalLayerLog(&(instPtr->phyLog));
} }
@@ -374,7 +388,7 @@ void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode)
* EPARAM - antenna index exceeds predefined range * 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); 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); DBG_INFO("Set new antenna index: %" PRId8 "\n", antIndex);
instPtr->antIndex.next = antIndex; instPtr->antIndex.next = antIndex;
Phy_SetTxAntIndex(instPtr, antIndex);
Phy_SetRxAntIndex(instPtr, antIndex);
return SUCCESS; return SUCCESS;
} }
/** /**
* @brief Get next antenna index. * @brief Get antenna index of the next slot.
*/
inline size_t Phy_GetCurrentAntIndex(PHY_INST *instPtr)
{
ASSERT(instPtr != NULL);
return instPtr->antIndex.curr;
}
/**
* @brief Get current antenna index.
*/ */
inline size_t Phy_GetNextAntIndex(PHY_INST *instPtr) inline size_t Phy_GetNextAntIndex(PHY_INST *instPtr)
{ {
@@ -406,7 +413,6 @@ inline size_t Phy_GetNextAntIndex(PHY_INST *instPtr)
return instPtr->antIndex.next; return instPtr->antIndex.next;
} }
/** @} PhysicalLayer_AntennaControl*/ /** @} PhysicalLayer_AntennaControl*/
/** @} PhysicalLayer*/ /** @} PhysicalLayer*/
@@ -80,16 +80,19 @@ typedef struct
uint8_t rfNormComAttn[L1_ANT_NUM]; uint8_t rfNormComAttn[L1_ANT_NUM];
///< Normal mode RF attenuation for combined channel: ///< Normal mode RF attenuation for combined channel:
/// 0~30 dB, 1dB step /// 0~30 dB, 1dB step
uint8_t rfMode; ///< Mode control: struct
/// [7]: reserved {
/// [6]: Antenna 3 tx control, 1 - enable, 0 - disable uint8_t antMode : 1; /// [0]: Anti-jamming mode 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 /// only one antenna can be selected in anti-jamming mode
/// [0]: Anti-jamming mode control, 1 - enable, 0 - disable 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]; uint8_t rfAntiAttn[L1_ANT_CH_NUM];
///< Anti-jamming mode RF attenuation, 4 channels: ///< Anti-jamming mode RF attenuation, 4 channels:
/// 0~60 dB, 1dB step /// 0~60 dB, 1dB step
@@ -141,6 +144,26 @@ typedef enum
PHY_ANT_MODE_ANTI_JAM = 3 PHY_ANT_MODE_ANTI_JAM = 3
} PHY_ANT_MODE; } 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 * @struct PHY_RCD
* @brief Physical Layer recode buffer * @brief Physical Layer recode buffer
@@ -198,7 +221,6 @@ typedef struct
#ifndef EMULATION #ifndef EMULATION
XAdcPs hwXadc; ///< hardware Xadc instance XAdcPs hwXadc; ///< hardware Xadc instance
#endif #endif
PHY_ANT_ANGLE antNrrwPattern[L1_ANT_PATTERN_NUM]; ///< antenna beam scan pattern
HWSTATE hwSate; ///< hardware state log HWSTATE hwSate; ///< hardware state log
PHYLOG phyLog; ///< physical state log PHYLOG phyLog; ///< physical state log
uint32_t lastLogTime; /// physical state log time stamp 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_AntConfigInit(PHY_ANT_CONFIG *antConfig);
void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode); void Phy_SetTxAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antIndex);
int32_t Phy_SetAntIndex(PHY_INST *instPtr, size_t antIndex); void Phy_SetRxAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antRxIndex);
size_t Phy_GetCurrentAntIndex(PHY_INST *instPtr); 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); size_t Phy_GetNextAntIndex(PHY_INST *instPtr);
/** @} PhysicalLayer_AntennaControl*/ /** @} PhysicalLayer_AntennaControl*/