forked from gatsby/df_datalink
feat: 更新天线控制逻辑
This commit is contained in:
@@ -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 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)
|
||||
{
|
||||
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:
|
||||
config |= ANT_MODE_TX1;
|
||||
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 1:
|
||||
config |= ANT_MODE_TX2;
|
||||
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 2:
|
||||
config |= ANT_MODE_TX3;
|
||||
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:
|
||||
config |= ANT_MODE_TX_OFF;
|
||||
DBG_WARNING("Unknown tx antenna number: %" PRIu8 ", tx is off.\n", antIndexCurr);
|
||||
instPtr->antConfig.antControl.antTx1En = ANT_DISABLE;
|
||||
instPtr->antConfig.antControl.antTx2En = ANT_DISABLE;
|
||||
instPtr->antConfig.antControl.antTx3En = ANT_DISABLE;
|
||||
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)
|
||||
{
|
||||
ASSERT(instPtr != NULL);
|
||||
|
||||
switch (antRxIndex)
|
||||
{
|
||||
case 0:
|
||||
config |= ANT_MODE_TX1;
|
||||
config |= ANT_MODE_RX_AJ1;
|
||||
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 1:
|
||||
config |= ANT_MODE_TX2;
|
||||
config |= ANT_MODE_RX_AJ2;
|
||||
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 2:
|
||||
config |= ANT_MODE_TX3;
|
||||
config |= ANT_MODE_RX_AJ3;
|
||||
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:
|
||||
config |= ANT_MODE_TX_OFF;
|
||||
config |= ANT_MODE_RX_NORMAL;
|
||||
DBG_WARNING("Unknown tx antenna number: %" PRIu8 ", remain normal mode.\n", antIndexCurr);
|
||||
instPtr->antConfig.antControl.antRx1En = ANT_DISABLE;
|
||||
instPtr->antConfig.antControl.antRx2En = ANT_DISABLE;
|
||||
instPtr->antConfig.antControl.antRx3En = ANT_DISABLE;
|
||||
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
|
||||
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
|
||||
struct
|
||||
{
|
||||
uint8_t antMode : 1; /// [0]: Anti-jamming mode control, 1 - enable, 0 - disable
|
||||
/// 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];
|
||||
///< 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
|
||||
@@ -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*/
|
||||
|
||||
|
||||
Reference in New Issue
Block a user