Compare commits
8
Commits
alpha-0.2
...
2b74942521
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b74942521 | ||
|
|
597ea2c7cd | ||
|
|
6d08ee216a | ||
|
|
d87a4434c7 | ||
|
|
c27d6fc455 | ||
|
|
0701eb6f43 | ||
|
|
ffc9f22694 | ||
|
|
c7898003c0 |
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* headless.h
|
* headless.h
|
||||||
*
|
*
|
||||||
* Created on: 2021Äê6ÔÂ8ÈÕ
|
* Created on: 2021��6��8��
|
||||||
* Author: Josh
|
* Author: Josh
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -30,7 +30,8 @@
|
|||||||
/**************************** Type Definitions *******************************/
|
/**************************** Type Definitions *******************************/
|
||||||
|
|
||||||
/***************** Macros (Inline Functions) Definitions *********************/
|
/***************** Macros (Inline Functions) Definitions *********************/
|
||||||
|
#define HW_PRINT(...) __asm__("nop")
|
||||||
|
// #define HW_PRINT(...) printf(__VA_ARGS__)
|
||||||
/************************** Variable Definitions *****************************/
|
/************************** Variable Definitions *****************************/
|
||||||
|
|
||||||
/************************** Function Prototypes ******************************/
|
/************************** Function Prototypes ******************************/
|
||||||
|
|||||||
@@ -51,33 +51,39 @@ void ScuTimer_IntrHandler(void *context);
|
|||||||
void Systembus_RxIntrHandler(void *context);
|
void Systembus_RxIntrHandler(void *context);
|
||||||
void Systembus_TxIntrHandler(void *context);
|
void Systembus_TxIntrHandler(void *context);
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
struct callback_desc phy_callback_desc = {
|
struct callback_desc phy_callback_desc =
|
||||||
|
{
|
||||||
.callback = Phy_IntrHandler,
|
.callback = Phy_IntrHandler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct callback_desc periodicpull_callback_desc = {
|
struct callback_desc periodicpull_callback_desc =
|
||||||
|
{
|
||||||
.callback = PeriodicPull_Handler,
|
.callback = PeriodicPull_Handler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct callback_desc sysbus_rx_callback_desc = {
|
struct callback_desc sysbus_rx_callback_desc =
|
||||||
|
{
|
||||||
.callback = Systembus_RxIntrHandler,
|
.callback = Systembus_RxIntrHandler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct callback_desc sysbus_tx_callback_desc = {
|
struct callback_desc sysbus_tx_callback_desc =
|
||||||
|
{
|
||||||
.callback = Systembus_TxIntrHandler,
|
.callback = Systembus_TxIntrHandler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct callback_desc scutm_callback_desc = {
|
struct callback_desc scutm_callback_desc =
|
||||||
|
{
|
||||||
.callback = ScuTimer_IntrHandler,
|
.callback = ScuTimer_IntrHandler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
L2_CONFIG linkConfig = {
|
L2_CONFIG linkConfig =
|
||||||
|
{
|
||||||
.myType = L2_NODE_HEAD,
|
.myType = L2_NODE_HEAD,
|
||||||
.clustId = 1,
|
.clustId = 1,
|
||||||
.myId = 1,
|
.myId = 1,
|
||||||
@@ -99,16 +105,22 @@ L2_CONFIG linkConfig = {
|
|||||||
// .tmcInstPtr = NULL
|
// .tmcInstPtr = NULL
|
||||||
// };
|
// };
|
||||||
|
|
||||||
static PHY_CONFIG phyConfig = {
|
static PHY_CONFIG phyConfig =
|
||||||
|
{
|
||||||
.devId = 0,
|
.devId = 0,
|
||||||
.baseAddr = PHY_BASEADDR,
|
.baseAddr = PHY_BASEADDR,
|
||||||
.antBramId = PHY_ANTCONFIG_BRAM_DEVICE_ID,
|
.antBramId = PHY_ANTCONFIG_BRAM_DEVICE_ID,
|
||||||
.txBramId = PHY_TXBUFF_BRAM_DEVICE_ID,
|
.txBramId = PHY_TXBUFF_BRAM_DEVICE_ID,
|
||||||
.rxBramId = PHY_RXBUFF_BRAM_DEVICE_ID,
|
.rxBramId = PHY_RXBUFF_BRAM_DEVICE_ID,
|
||||||
.hwXadcId = PHY_HW_XADC_DEVICE_ID
|
.hwXadcId = PHY_HW_XADC_DEVICE_ID,
|
||||||
|
.get_clk_state = NULL,
|
||||||
|
.get_ad_lock_state = NULL,
|
||||||
|
.get_ad0_temp = NULL,
|
||||||
|
.get_ad1_temp = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
TMC_CONFIG tmcConfig = {
|
TMC_CONFIG tmcConfig =
|
||||||
|
{
|
||||||
.baseAddr = TIME_CONTROLLER_BASEADDR,
|
.baseAddr = TIME_CONTROLLER_BASEADDR,
|
||||||
.reset = 10
|
.reset = 10
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,15 +8,18 @@ LD_SRCS += \
|
|||||||
|
|
||||||
C_SRCS += \
|
C_SRCS += \
|
||||||
../src/main.c \
|
../src/main.c \
|
||||||
../src/system_monitor.c
|
../src/system_monitor.c \
|
||||||
|
../src/hwconfig.c
|
||||||
|
|
||||||
OBJS += \
|
OBJS += \
|
||||||
./src/main.o \
|
./src/main.o \
|
||||||
./src/system_monitor.o
|
./src/system_monitor.o \
|
||||||
|
./src/hwconfig.o
|
||||||
|
|
||||||
C_DEPS += \
|
C_DEPS += \
|
||||||
./src/main.d \
|
./src/main.d \
|
||||||
./src/system_monitor.d
|
./src/system_monitor.d \
|
||||||
|
./src/hwconfig.d
|
||||||
|
|
||||||
|
|
||||||
# Each subdirectory must supply rules for building sources it contributes
|
# Each subdirectory must supply rules for building sources it contributes
|
||||||
|
|||||||
@@ -0,0 +1,464 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Description: hwconfig.h
|
||||||
|
*
|
||||||
|
|
||||||
|
* Date: 2024-02-20 13:19
|
||||||
|
* Last Edit Time: [2024-02-20 13:19]
|
||||||
|
*
|
||||||
|
* Revisions: Rev 0.0
|
||||||
|
* History:
|
||||||
|
* [2023-05-07]: Initial edition.
|
||||||
|
*
|
||||||
|
* Copyright(c) 2024 Beijing Institute of Technology.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/***************************** Include Files *********************************/
|
||||||
|
// Standard
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
// Xilinx
|
||||||
|
#include "xgpiops.h"
|
||||||
|
#include "drivers/rf-transceiver/ad9361_reg/ad9361_reg.h"
|
||||||
|
#include "drivers/rf-transceiver/ad9361/ad9361_api.h"
|
||||||
|
#include "drivers/axi_core/spi_engine/spi_engine.h"
|
||||||
|
// App
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "delay.h"
|
||||||
|
#include "system_monitor.h"
|
||||||
|
#include "hwconfig.h"
|
||||||
|
#include "config/app_config.h"
|
||||||
|
#include "dev_profile/dev_profile.h"
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
|
/*********************** Driver Instance Definitions **************************/
|
||||||
|
static struct hmc7044_dev *hmc7044_inst;
|
||||||
|
static struct ad9361_reg_dev *ad9361_1_reg_inst;
|
||||||
|
static struct ad9361_reg_dev *ad9361_2_reg_inst;
|
||||||
|
// static struct ad9361_rf_phy *ad9361_phy;
|
||||||
|
// static struct ad9361_rf_phy *ad9361_2_phy;
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Hardware_Init
|
||||||
|
*
|
||||||
|
* @param none.
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Hardware_Init(void)
|
||||||
|
{
|
||||||
|
int32_t Status;
|
||||||
|
XGpioPs Gpio;
|
||||||
|
XGpioPs_Config *ConfigPtr;
|
||||||
|
ConfigPtr = XGpioPs_LookupConfig(AD9361_GPIO_DEVICE_ID);
|
||||||
|
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/****************** HMC7044 Configuration *****************/
|
||||||
|
/**********************************************************/
|
||||||
|
Status = hmc7044_init(&hmc7044_inst, &hmc7044_default_init_param);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
DBG_ERROR("hmc7044_init() error: %" PRId32 "\n", Status);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/***************** AD9361-1 Configuration *****************/
|
||||||
|
/**********************************************************/
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_TXNRX, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_ENABLE, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_EN_AGC, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_RESET_B, AD9361_GPIO_OUTPUT);
|
||||||
|
|
||||||
|
ad9361_reg_init(&ad9361_1_reg_inst, &ad9361_1_reg_default_init_param);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_ENABLE, 0);
|
||||||
|
ad9361_reg_config(ad9361_1_reg_inst);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_ENABLE, 1);
|
||||||
|
|
||||||
|
// Status = ad9361_init(&ad9361_phy, &ad9361_default_init_param);
|
||||||
|
// if (Status != XST_SUCCESS){
|
||||||
|
// return XST_FAILURE;
|
||||||
|
// }else{
|
||||||
|
// printf("Configurate AD9361 Completely!\n");
|
||||||
|
// }
|
||||||
|
// ad9361_set_tx_fir_config(ad9361_phy, tx_fir_config);
|
||||||
|
// ad9361_set_rx_fir_config(ad9361_phy, rx_fir_config);
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/***************** AD9361-2 Configuration *****************/
|
||||||
|
/**********************************************************/
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_TXNRX, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_ENABLE, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_EN_AGC, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_RESET_B, AD9361_GPIO_OUTPUT);
|
||||||
|
|
||||||
|
ad9361_reg_init(&ad9361_2_reg_inst, &ad9361_2_reg_default_init_param);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_2_ENABLE, 0);
|
||||||
|
ad9361_reg_config(ad9361_2_reg_inst);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_2_ENABLE, 1);
|
||||||
|
|
||||||
|
// uint8_t rd_back;
|
||||||
|
// Status = ad9361_reg_read(ad9361_1_reg_inst, 0x0002, &rd_back);
|
||||||
|
// Status = ad9361_reg_read(ad9361_2_reg_inst, 0x0002, &rd_back);
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/******* AD9361 Baseband Multichip Synchronization ********/
|
||||||
|
/**********************************************************/
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_SYNC, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_RX_FIFO_RST, AD9361_GPIO_OUTPUT);
|
||||||
|
|
||||||
|
// SYNC BBPLL and DIGITAL SAMPLING CLOCKS
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x0D); // MCS RF Enable; MCS BBPLL Enable; MCS BB Enable
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x0D);
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x0047, 0x80); // MCS refclk Scale Enable
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x0047, 0x80);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
||||||
|
mdelay(20);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 1); // Input a rising-edge pulse to the SYNC_IN pin
|
||||||
|
mdelay(500);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
||||||
|
mdelay(2000);
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x0B); // MCS RF Enable; MCS Digital CLK Enable ; MCS BB Enable
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x0B);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 1); // Input another rising-edge pulse to the SYNC_IN pin
|
||||||
|
mdelay(500);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x08); // clear MCS bits
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x08);
|
||||||
|
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 0);
|
||||||
|
mdelay(20);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 1);
|
||||||
|
mdelay(20);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 0);
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/********* AD9361 Multichip Rx Phase Calibration **********/
|
||||||
|
/**********************************************************/
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_TX_SWITCH, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_CAL_START, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_CAL_DONE, AD9361_GPIO_INPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_CAL_START, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_CAL_DONE, AD9361_GPIO_INPUT);
|
||||||
|
|
||||||
|
// switch to lower frequency
|
||||||
|
Status = Hardware_SwitchFreq(ad9361_1_reg_inst, TX_FREQ_126);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_TX_SWITCH, 1);
|
||||||
|
mdelay(20);
|
||||||
|
|
||||||
|
// switch rx channel
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x30);
|
||||||
|
Status = ad9361_reg_write(ad9361_2_reg_inst, 0x0004, 0x30);
|
||||||
|
|
||||||
|
// enable dual ad9361 tx channels
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0002, 0xE4); // Setup Tx Digital Filters/ Channels
|
||||||
|
|
||||||
|
// switch ad9361 tx channel
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x70); // Select Rx input pin(A,B,C)/ Tx out pin (A,B)
|
||||||
|
mdelay(20);
|
||||||
|
|
||||||
|
// begin to calibrate the 1st ad9361
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 0);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 1);
|
||||||
|
mdelay(1);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 0);
|
||||||
|
|
||||||
|
// read calibration status
|
||||||
|
int32_t time_out_cnt = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
mdelay(1); // Wait 1ms
|
||||||
|
time_out_cnt++;
|
||||||
|
} while (((XGpioPs_ReadPin(&Gpio, AD9361_1_CAL_DONE) == 0) && time_out_cnt <= AD9361_TIMEOUT_TH));
|
||||||
|
|
||||||
|
if (time_out_cnt == AD9361_TIMEOUT_TH)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// begin to calibrate the 2nd ad9361
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_2_CAL_START, 1);
|
||||||
|
mdelay(1);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_2_CAL_START, 0);
|
||||||
|
|
||||||
|
// read calibration status
|
||||||
|
time_out_cnt = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
mdelay(1); // Wait 1ms
|
||||||
|
time_out_cnt++;
|
||||||
|
} while (((XGpioPs_ReadPin(&Gpio, AD9361_2_CAL_DONE) == 0) && time_out_cnt <= AD9361_TIMEOUT_TH));
|
||||||
|
|
||||||
|
if (time_out_cnt == AD9361_TIMEOUT_TH)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// enable single ad9361 tx channels
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0002, 0xA4); // Setup Tx Digital Filters/ Channels
|
||||||
|
|
||||||
|
// switch ad9361 tx & rx channel
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x03);
|
||||||
|
Status = ad9361_reg_write(ad9361_2_reg_inst, 0x0004, 0x03);
|
||||||
|
|
||||||
|
// switch to higher frequency
|
||||||
|
Status = Hardware_SwitchFreq(ad9361_1_reg_inst, TX_FREQ_4125);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_TX_SWITCH, 0);
|
||||||
|
|
||||||
|
DBG_PRINT("Done.\n");
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Hardware_SwitchFreq
|
||||||
|
*
|
||||||
|
* @param devSysMonitor_UpdateHardwareStatus(newHwState);
|
||||||
|
* @param freq
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Hardware_SwitchFreq(struct ad9361_reg_dev *dev, ad9361TxFreq freq)
|
||||||
|
{
|
||||||
|
int32_t status = 0;
|
||||||
|
uint8_t value = 0;
|
||||||
|
int32_t time_out_cnt = 0;
|
||||||
|
|
||||||
|
switch (freq)
|
||||||
|
{
|
||||||
|
case TX_FREQ_125:
|
||||||
|
{
|
||||||
|
//************************************************************
|
||||||
|
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x027B, 0x94); // Set Synth Loop Filter charge pump current (Icp)
|
||||||
|
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
||||||
|
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
||||||
|
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Write Tx Frequency Words
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x0273, 0x00); // Write Tx Synth Fractional Freq Word[7:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0274, 0x00); // Write Tx Synth Fractional Freq Word[15:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0275, 0x00); // Write Tx Synth Fractional Freq Word[22:16]
|
||||||
|
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0271, 0xA0); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
||||||
|
status = ad9361_reg_write(dev, 0x0005, 0x57); // Set LO divider setting
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Tx Quadrature Calibration Settings
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
||||||
|
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
||||||
|
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
||||||
|
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
||||||
|
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00AA, 0x22); // Set Tx Quad Cal Gain Table index
|
||||||
|
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00AE, 0x00); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
||||||
|
|
||||||
|
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
||||||
|
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TX_FREQ_126:
|
||||||
|
{
|
||||||
|
//************************************************************
|
||||||
|
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x027B, 0x93); // Set Synth Loop Filter charge pump current (Icp)
|
||||||
|
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
||||||
|
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
||||||
|
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Write Tx Frequency Words
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x0273, 0x06); // Write Tx Synth Fractional Freq Word[7:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0274, 0xD7); // Write Tx Synth Fractional Freq Word[15:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0275, 0x23); // Write Tx Synth Fractional Freq Word[22:16]
|
||||||
|
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0271, 0xA1); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
||||||
|
status = ad9361_reg_write(dev, 0x0005, 0x57); // Set LO divider setting
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Tx Quadrature Calibration Settings
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
||||||
|
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
||||||
|
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
||||||
|
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
||||||
|
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00AA, 0x22); // Set Tx Quad Cal Gain Table index
|
||||||
|
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00AE, 0x00); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
||||||
|
|
||||||
|
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
||||||
|
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TX_FREQ_4125:
|
||||||
|
{
|
||||||
|
//************************************************************
|
||||||
|
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x027B, 0x93); // Set Synth Loop Filter charge pump current (Icp)
|
||||||
|
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
||||||
|
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
||||||
|
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Write Rx Frequency Words
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x0273, 0x00); // Write Tx Synth Fractional Freq Word[7:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0274, 0x00); // Write Tx Synth Fractional Freq Word[15:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0275, 0x00); // Write Tx Synth Fractional Freq Word[22:16]
|
||||||
|
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0271, 0xA5); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
||||||
|
status = ad9361_reg_write(dev, 0x0005, 0x07); // Set LO divider setting
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Tx Quadrature Calibration Settings
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
||||||
|
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
||||||
|
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
||||||
|
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
||||||
|
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00AA, 0x28); // Set Tx Quad Cal Gain Table index
|
||||||
|
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00AE, 0x04); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
||||||
|
|
||||||
|
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
||||||
|
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for cal to complete (Done when 0x016[4]==0)
|
||||||
|
time_out_cnt = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
status |= ad9361_reg_read(dev, 0x0016, &value);
|
||||||
|
mdelay(1); // Wait 1ms
|
||||||
|
time_out_cnt++;
|
||||||
|
} while ((value & 0x10) != 0x00 && time_out_cnt <= AD9361_TIMEOUT_TH);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ Get AD9361 - 1 temperature (Celsius Degree)
|
||||||
|
/**
|
||||||
|
* Read corresponding register to get AD9361 - 1 current temperature.
|
||||||
|
*/
|
||||||
|
int8_t Hardware_GetAD9361Temp_1(void)
|
||||||
|
{
|
||||||
|
int8_t scaleTemp;
|
||||||
|
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x001D, 0x01); // disable aux adc
|
||||||
|
ad9361_reg_read(ad9361_1_reg_inst, 0x000E, (uint8_t*)&scaleTemp);
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x001D, 0x00); // enable aux adc
|
||||||
|
|
||||||
|
return (int8_t) scaleTemp/1.16;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ Get AD9361 - 2 temperature (Celsius Degree)
|
||||||
|
/**
|
||||||
|
* Read corresponding register to get AD9361 - 2 current temperature.
|
||||||
|
*/
|
||||||
|
int8_t Hardware_GetAD9361Temp_2(void)
|
||||||
|
{
|
||||||
|
int8_t scaleTemp;
|
||||||
|
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x001D, 0x01); // disable aux adc
|
||||||
|
ad9361_reg_read(ad9361_2_reg_inst, 0x000E, (uint8_t*)&scaleTemp);
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x001D, 0x00); // enable aux adc
|
||||||
|
|
||||||
|
return (int8_t) scaleTemp/1.16;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ Determine AD9361 lock state
|
||||||
|
/**
|
||||||
|
* Read corresponding register to determine AD9361(both) lock state.
|
||||||
|
*/
|
||||||
|
uint8_t Hardware_GetAD9361LockStatus(void)
|
||||||
|
{
|
||||||
|
uint8_t ret = 0;
|
||||||
|
uint8_t regVal;
|
||||||
|
|
||||||
|
// bbpll
|
||||||
|
ad9361_reg_read(ad9361_1_reg_inst, 0x005E, ®Val); // [D7] is lock indicator
|
||||||
|
ret |= ((regVal & 0x80) == 0x80) ? CLK_AD0_BBPLL_LOCK : 0;
|
||||||
|
ad9361_reg_read(ad9361_2_reg_inst, 0x005E, ®Val); // [D7] is lock indicator
|
||||||
|
ret |= ((regVal & 0x80) == 0x80) ? CLK_AD1_BBPLL_LOCK : 0;
|
||||||
|
|
||||||
|
// rfpll
|
||||||
|
ad9361_reg_read(ad9361_1_reg_inst, 0x0287, ®Val); // [D1] is lock indicator
|
||||||
|
ret |= ((regVal & 0x02) == 0x02) ? CLK_AD0_RFPLL_LOCK : 0;
|
||||||
|
ad9361_reg_read(ad9361_2_reg_inst, 0x0287, ®Val); // [D1] is lock indicator
|
||||||
|
ret |= ((regVal & 0x02) == 0x02) ? CLK_AD1_RFPLL_LOCK : 0;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ Determine HMC7044 lock state
|
||||||
|
/**
|
||||||
|
* Read corresponding register to determine clock lock state.
|
||||||
|
*/
|
||||||
|
uint8_t Hardware_GetHMC7044LockStatus(void)
|
||||||
|
{
|
||||||
|
uint8_t ret = 0;
|
||||||
|
uint8_t regVal;
|
||||||
|
|
||||||
|
// pll1
|
||||||
|
hmc7044_read(hmc7044_inst, 0x007C, ®Val); // [D5] is lock indicator
|
||||||
|
ret |= ((regVal & 0xE0) != 0x00) ? CLK_SP_PLL0_LOCK : 0;
|
||||||
|
|
||||||
|
// pll2
|
||||||
|
hmc7044_read(hmc7044_inst, 0x007D, ®Val); // [D0] is lock indicator
|
||||||
|
ret |= ((regVal & 0x01) == 0x01) ? CLK_SP_PLL1_LOCK : 0;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Description: hwconfig.h
|
||||||
|
*
|
||||||
|
|
||||||
|
* Date: 2024-02-20 13:19
|
||||||
|
* Last Edit Time: [2024-02-20 13:19]
|
||||||
|
*
|
||||||
|
* Revisions: Rev 0.0
|
||||||
|
* History:
|
||||||
|
* [2023-05-07]: Initial edition.
|
||||||
|
*
|
||||||
|
* Copyright(c) 2024 Beijing Institute of Technology.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/***************************** Include Files *********************************/
|
||||||
|
// Standard
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "config/app_config.h"
|
||||||
|
#include "drivers/rf-transceiver/ad9361_reg/ad9361_reg.h"
|
||||||
|
#include "drivers/rf-transceiver/ad9361/ad9361_api.h"
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
|
int32_t Hardware_Init(void);
|
||||||
|
int32_t Hardware_SwitchFreq(struct ad9361_reg_dev *dev, ad9361TxFreq freq);
|
||||||
|
int8_t Hardware_GetAD9361Temp_1(void);
|
||||||
|
int8_t Hardware_GetAD9361Temp_2(void);
|
||||||
|
uint8_t Hardware_GetAD9361LockStatus(void);
|
||||||
|
uint8_t Hardware_GetHMC7044LockStatus(void);
|
||||||
|
|
||||||
|
|
||||||
+9
-361
@@ -20,19 +20,15 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
// Xilinx
|
// Xilinx
|
||||||
#include "sleep.h"
|
|
||||||
#include "xil_cache.h"
|
|
||||||
#include "xscugic.h"
|
#include "xscugic.h"
|
||||||
#include "xscutimer.h"
|
|
||||||
#include "xgpiops.h"
|
|
||||||
#include "drivers/platform/xilinx_irq.h"
|
#include "drivers/platform/xilinx_irq.h"
|
||||||
#include "drivers/platform/xilinx_timer.h"
|
#include "drivers/platform/xilinx_timer.h"
|
||||||
#include "drivers/rf-transceiver/ad9361/ad9361_api.h"
|
|
||||||
#include "drivers/axi_core/spi_engine/spi_engine.h"
|
|
||||||
// App
|
// App
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
#include "hwconfig.h"
|
||||||
|
#include "system_monitor.h"
|
||||||
#include "config/app_config.h"
|
#include "config/app_config.h"
|
||||||
#include "dev_profile/dev_profile.h"
|
#include "dev_profile/dev_profile.h"
|
||||||
#include "systembus/systembus.h"
|
#include "systembus/systembus.h"
|
||||||
@@ -46,6 +42,7 @@ void PeriodicPull_Handler(void *callBackRef);
|
|||||||
void ScuTimer_IntrHandler(void *context);
|
void ScuTimer_IntrHandler(void *context);
|
||||||
void Systembus_RxIntrHandler(void *context);
|
void Systembus_RxIntrHandler(void *context);
|
||||||
void Systembus_TxIntrHandler(void *context);
|
void Systembus_TxIntrHandler(void *context);
|
||||||
|
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
struct callback_desc phy_callback_desc = {
|
struct callback_desc phy_callback_desc = {
|
||||||
.callback = Phy_IntrHandler,
|
.callback = Phy_IntrHandler,
|
||||||
@@ -101,7 +98,11 @@ static PHY_CONFIG phyConfig = {
|
|||||||
.antBramId = PHY_ANTCONFIG_BRAM_DEVICE_ID,
|
.antBramId = PHY_ANTCONFIG_BRAM_DEVICE_ID,
|
||||||
.txBramId = PHY_TXBUFF_BRAM_DEVICE_ID,
|
.txBramId = PHY_TXBUFF_BRAM_DEVICE_ID,
|
||||||
.rxBramId = PHY_RXBUFF_BRAM_DEVICE_ID,
|
.rxBramId = PHY_RXBUFF_BRAM_DEVICE_ID,
|
||||||
.hwXadcId = PHY_HW_XADC_DEVICE_ID
|
.hwXadcId = PHY_HW_XADC_DEVICE_ID,
|
||||||
|
.get_clk_state = Hardware_GetHMC7044LockStatus,
|
||||||
|
.get_ad_lock_state = Hardware_GetAD9361LockStatus,
|
||||||
|
.get_ad0_temp = Hardware_GetAD9361Temp_1,
|
||||||
|
.get_ad1_temp = Hardware_GetAD9361Temp_2
|
||||||
};
|
};
|
||||||
|
|
||||||
TMC_CONFIG tmcConfig = {
|
TMC_CONFIG tmcConfig = {
|
||||||
@@ -122,11 +123,7 @@ static PHY_INST *phyInstPtr;
|
|||||||
static TMC_INST *tmcInstPtr = NULL;
|
static TMC_INST *tmcInstPtr = NULL;
|
||||||
L2_INST *linkInstPtr;
|
L2_INST *linkInstPtr;
|
||||||
|
|
||||||
static struct hmc7044_dev *hmc7044_inst;
|
|
||||||
static struct ad9361_reg_dev *ad9361_1_reg_inst;
|
|
||||||
static struct ad9361_reg_dev *ad9361_2_reg_inst;
|
|
||||||
// static struct ad9361_rf_phy *ad9361_phy;
|
|
||||||
// static struct ad9361_rf_phy *ad9361_2_phy;
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* This function is responsible for initializing the SCUGIC instance, looking
|
* This function is responsible for initializing the SCUGIC instance, looking
|
||||||
@@ -370,355 +367,6 @@ void ScuTimer_IntrHandler(void *context)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Hardware_SwitchFreq
|
|
||||||
*
|
|
||||||
* @param devSysMonitor_UpdateHardwareStatus(newHwState);
|
|
||||||
* @param freq
|
|
||||||
*
|
|
||||||
* @return None.
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
int Hardware_SwitchFreq(struct ad9361_reg_dev *dev, ad9361TxFreq freq)
|
|
||||||
{
|
|
||||||
int32_t status = 0;
|
|
||||||
uint8_t value = 0;
|
|
||||||
int32_t time_out_cnt = 0;
|
|
||||||
|
|
||||||
switch (freq)
|
|
||||||
{
|
|
||||||
case TX_FREQ_125:
|
|
||||||
{
|
|
||||||
//************************************************************
|
|
||||||
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x027B, 0x94); // Set Synth Loop Filter charge pump current (Icp)
|
|
||||||
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
|
||||||
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
|
||||||
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Write Tx Frequency Words
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x0273, 0x00); // Write Tx Synth Fractional Freq Word[7:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0274, 0x00); // Write Tx Synth Fractional Freq Word[15:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0275, 0x00); // Write Tx Synth Fractional Freq Word[22:16]
|
|
||||||
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0271, 0xA0); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
|
||||||
status = ad9361_reg_write(dev, 0x0005, 0x57); // Set LO divider setting
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Tx Quadrature Calibration Settings
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
|
||||||
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
|
||||||
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
|
||||||
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
|
||||||
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00AA, 0x22); // Set Tx Quad Cal Gain Table index
|
|
||||||
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00AE, 0x00); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
|
||||||
|
|
||||||
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
|
||||||
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TX_FREQ_126:
|
|
||||||
{
|
|
||||||
//************************************************************
|
|
||||||
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x027B, 0x93); // Set Synth Loop Filter charge pump current (Icp)
|
|
||||||
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
|
||||||
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
|
||||||
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Write Tx Frequency Words
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x0273, 0x06); // Write Tx Synth Fractional Freq Word[7:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0274, 0xD7); // Write Tx Synth Fractional Freq Word[15:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0275, 0x23); // Write Tx Synth Fractional Freq Word[22:16]
|
|
||||||
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0271, 0xA1); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
|
||||||
status = ad9361_reg_write(dev, 0x0005, 0x57); // Set LO divider setting
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Tx Quadrature Calibration Settings
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
|
||||||
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
|
||||||
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
|
||||||
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
|
||||||
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00AA, 0x22); // Set Tx Quad Cal Gain Table index
|
|
||||||
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00AE, 0x00); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
|
||||||
|
|
||||||
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
|
||||||
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TX_FREQ_4125:
|
|
||||||
{
|
|
||||||
//************************************************************
|
|
||||||
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x027B, 0x93); // Set Synth Loop Filter charge pump current (Icp)
|
|
||||||
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
|
||||||
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
|
||||||
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Write Rx Frequency Words
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x0273, 0x00); // Write Tx Synth Fractional Freq Word[7:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0274, 0x00); // Write Tx Synth Fractional Freq Word[15:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0275, 0x00); // Write Tx Synth Fractional Freq Word[22:16]
|
|
||||||
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0271, 0xA5); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
|
||||||
status = ad9361_reg_write(dev, 0x0005, 0x07); // Set LO divider setting
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Tx Quadrature Calibration Settings
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
|
||||||
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
|
||||||
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
|
||||||
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
|
||||||
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00AA, 0x28); // Set Tx Quad Cal Gain Table index
|
|
||||||
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00AE, 0x04); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
|
||||||
|
|
||||||
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
|
||||||
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for cal to complete (Done when 0x016[4]==0)
|
|
||||||
time_out_cnt = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
status |= ad9361_reg_read(dev, 0x0016, &value);
|
|
||||||
mdelay(1); // Wait 1ms
|
|
||||||
time_out_cnt++;
|
|
||||||
} while ((value & 0x10) != 0x00 && time_out_cnt <= AD9361_TIMEOUT_TH);
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Hardware_Init
|
|
||||||
*
|
|
||||||
* @param none.
|
|
||||||
*
|
|
||||||
* @return None.
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
int Hardware_Init(void)
|
|
||||||
{
|
|
||||||
int32_t Status;
|
|
||||||
XGpioPs Gpio;
|
|
||||||
XGpioPs_Config *ConfigPtr;
|
|
||||||
ConfigPtr = XGpioPs_LookupConfig(AD9361_GPIO_DEVICE_ID);
|
|
||||||
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
|
|
||||||
if (Status != SUCCESS)
|
|
||||||
{
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/****************** HMC7044 Configuration *****************/
|
|
||||||
/**********************************************************/
|
|
||||||
Status = hmc7044_init(&hmc7044_inst, &hmc7044_default_init_param);
|
|
||||||
if (Status != SUCCESS)
|
|
||||||
{
|
|
||||||
DBG_ERROR("hmc7044_init() error: %" PRId32 "\n", Status);
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/***************** AD9361-1 Configuration *****************/
|
|
||||||
/**********************************************************/
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_TXNRX, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_ENABLE, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_EN_AGC, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_RESET_B, AD9361_GPIO_OUTPUT);
|
|
||||||
|
|
||||||
ad9361_reg_init(&ad9361_1_reg_inst, &ad9361_1_reg_default_init_param);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_ENABLE, 0);
|
|
||||||
ad9361_reg_config(ad9361_1_reg_inst);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_ENABLE, 1);
|
|
||||||
|
|
||||||
// Status = ad9361_init(&ad9361_phy, &ad9361_default_init_param);
|
|
||||||
// if (Status != XST_SUCCESS){
|
|
||||||
// return XST_FAILURE;
|
|
||||||
// }else{
|
|
||||||
// printf("Configurate AD9361 Completely!\n");
|
|
||||||
// }
|
|
||||||
// ad9361_set_tx_fir_config(ad9361_phy, tx_fir_config);
|
|
||||||
// ad9361_set_rx_fir_config(ad9361_phy, rx_fir_config);
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/***************** AD9361-2 Configuration *****************/
|
|
||||||
/**********************************************************/
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_TXNRX, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_ENABLE, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_EN_AGC, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_RESET_B, AD9361_GPIO_OUTPUT);
|
|
||||||
|
|
||||||
ad9361_reg_init(&ad9361_2_reg_inst, &ad9361_2_reg_default_init_param);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_2_ENABLE, 0);
|
|
||||||
ad9361_reg_config(ad9361_2_reg_inst);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_2_ENABLE, 1);
|
|
||||||
|
|
||||||
// uint8_t rd_back;
|
|
||||||
// Status = ad9361_reg_read(ad9361_1_reg_inst, 0x0002, &rd_back);
|
|
||||||
// Status = ad9361_reg_read(ad9361_2_reg_inst, 0x0002, &rd_back);
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/******* AD9361 Baseband Multichip Synchronization ********/
|
|
||||||
/**********************************************************/
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_SYNC, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_RX_FIFO_RST, AD9361_GPIO_OUTPUT);
|
|
||||||
|
|
||||||
// SYNC BBPLL and DIGITAL SAMPLING CLOCKS
|
|
||||||
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x0D); // MCS RF Enable; MCS BBPLL Enable; MCS BB Enable
|
|
||||||
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x0D);
|
|
||||||
ad9361_reg_write(ad9361_1_reg_inst, 0x0047, 0x80); // MCS refclk Scale Enable
|
|
||||||
ad9361_reg_write(ad9361_2_reg_inst, 0x0047, 0x80);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
|
||||||
mdelay(20);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 1); // Input a rising-edge pulse to the SYNC_IN pin
|
|
||||||
mdelay(500);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
|
||||||
mdelay(2000);
|
|
||||||
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x0B); // MCS RF Enable; MCS Digital CLK Enable ; MCS BB Enable
|
|
||||||
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x0B);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 1); // Input another rising-edge pulse to the SYNC_IN pin
|
|
||||||
mdelay(500);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
|
||||||
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x08); // clear MCS bits
|
|
||||||
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x08);
|
|
||||||
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 0);
|
|
||||||
mdelay(20);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 1);
|
|
||||||
mdelay(20);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 0);
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/********* AD9361 Multichip Rx Phase Calibration **********/
|
|
||||||
/**********************************************************/
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_TX_SWITCH, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_CAL_START, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_CAL_DONE, AD9361_GPIO_INPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_CAL_START, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_CAL_DONE, AD9361_GPIO_INPUT);
|
|
||||||
|
|
||||||
// switch to lower frequency
|
|
||||||
Status = Hardware_SwitchFreq(ad9361_1_reg_inst, TX_FREQ_126);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_TX_SWITCH, 1);
|
|
||||||
mdelay(20);
|
|
||||||
|
|
||||||
// switch rx channel
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x30);
|
|
||||||
Status = ad9361_reg_write(ad9361_2_reg_inst, 0x0004, 0x30);
|
|
||||||
|
|
||||||
// enable dual ad9361 tx channels
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0002, 0xE4); // Setup Tx Digital Filters/ Channels
|
|
||||||
|
|
||||||
// switch ad9361 tx channel
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x70); // Select Rx input pin(A,B,C)/ Tx out pin (A,B)
|
|
||||||
mdelay(20);
|
|
||||||
|
|
||||||
// begin to calibrate the 1st ad9361
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 0);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 1);
|
|
||||||
mdelay(1);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 0);
|
|
||||||
|
|
||||||
// read calibration status
|
|
||||||
int32_t time_out_cnt = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
mdelay(1); // Wait 1ms
|
|
||||||
time_out_cnt++;
|
|
||||||
} while (((XGpioPs_ReadPin(&Gpio, AD9361_1_CAL_DONE) == 0) && time_out_cnt <= AD9361_TIMEOUT_TH));
|
|
||||||
|
|
||||||
if (time_out_cnt == AD9361_TIMEOUT_TH)
|
|
||||||
{
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// begin to calibrate the 2nd ad9361
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_2_CAL_START, 1);
|
|
||||||
mdelay(1);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_2_CAL_START, 0);
|
|
||||||
|
|
||||||
// read calibration status
|
|
||||||
time_out_cnt = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
mdelay(1); // Wait 1ms
|
|
||||||
time_out_cnt++;
|
|
||||||
} while (((XGpioPs_ReadPin(&Gpio, AD9361_2_CAL_DONE) == 0) && time_out_cnt <= AD9361_TIMEOUT_TH));
|
|
||||||
|
|
||||||
if (time_out_cnt == AD9361_TIMEOUT_TH)
|
|
||||||
{
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// enable single ad9361 tx channels
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0002, 0xA4); // Setup Tx Digital Filters/ Channels
|
|
||||||
|
|
||||||
// switch ad9361 tx & rx channel
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x03);
|
|
||||||
Status = ad9361_reg_write(ad9361_2_reg_inst, 0x0004, 0x03);
|
|
||||||
|
|
||||||
// switch to higher frequency
|
|
||||||
Status = Hardware_SwitchFreq(ad9361_1_reg_inst, TX_FREQ_4125);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_TX_SWITCH, 0);
|
|
||||||
|
|
||||||
DBG_PRINT("Done.\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Main function, initialize all the device needed, initialize
|
* @brief Main function, initialize all the device needed, initialize
|
||||||
|
|||||||
@@ -1249,7 +1249,9 @@ int32_t Linklayer_Proc(L2_INST *instPtr)
|
|||||||
instPtr->linkLog.svcTxCnt = instPtr->log.svcTxCnt;
|
instPtr->linkLog.svcTxCnt = instPtr->log.svcTxCnt;
|
||||||
instPtr->linkLog.svcRecvCnt = instPtr->log.svcRecvCnt;
|
instPtr->linkLog.svcRecvCnt = instPtr->log.svcRecvCnt;
|
||||||
instPtr->linkLog.svcCorrectCnt = instPtr->log.svcCorrectCnt;
|
instPtr->linkLog.svcCorrectCnt = instPtr->log.svcCorrectCnt;
|
||||||
instPtr->linkLog.timeDev = instPtr->log.timeDev;
|
instPtr->linkLog.timeDev = (instPtr->log.timeDev > INT32_MAX) ?
|
||||||
|
INT32_MAX :
|
||||||
|
((instPtr->log.timeDev < INT32_MIN) ? INT32_MIN : (int32_t) instPtr->log.timeDev);
|
||||||
instPtr->linkLog.sendId = instPtr->serviceFSM->txLog.dataId;
|
instPtr->linkLog.sendId = instPtr->serviceFSM->txLog.dataId;
|
||||||
instPtr->linkLog.recvId = instPtr->serviceFSM->rxLog.dataId;
|
instPtr->linkLog.recvId = instPtr->serviceFSM->rxLog.dataId;
|
||||||
|
|
||||||
|
|||||||
@@ -311,26 +311,28 @@ void Phy_UpdateState(PHY_INST *instPtr)
|
|||||||
instPtr->recvSlotTime.frac_part = PhyRead(instPtr, TM_TARGET_L);
|
instPtr->recvSlotTime.frac_part = PhyRead(instPtr, TM_TARGET_L);
|
||||||
instPtr->recvFsTime.int_part = PhyRead(instPtr, FSTIME_H);
|
instPtr->recvFsTime.int_part = PhyRead(instPtr, FSTIME_H);
|
||||||
instPtr->recvFsTime.frac_part = PhyRead(instPtr, FSTIME_L);
|
instPtr->recvFsTime.frac_part = PhyRead(instPtr, FSTIME_L);
|
||||||
|
|
||||||
instPtr->phyLog.acqCnt = PhyRead(instPtr, PHY_ACQ_CNT);
|
instPtr->phyLog.acqCnt = PhyRead(instPtr, PHY_ACQ_CNT);
|
||||||
instPtr->phyLog.fsyncCnt = PhyRead(instPtr, PHY_FRAME_SYNC_CNT);
|
instPtr->phyLog.fsyncCnt = PhyRead(instPtr, PHY_FRAME_SYNC_CNT);
|
||||||
instPtr->phyLog.decodeCnt = PhyRead(instPtr, PHY_DECODE_CNT);
|
instPtr->phyLog.decodeCnt = PhyRead(instPtr, PHY_DECODE_CNT);
|
||||||
instPtr->phyLog.crcCnt = PhyRead(instPtr, PHY_CRC_OK_CNT);
|
instPtr->phyLog.crcCnt = PhyRead(instPtr, PHY_CRC_OK_CNT);
|
||||||
instPtr->phyLog.doppler = Phy_GetFreqEst(instPtr);
|
instPtr->phyLog.doppler = Phy_GetFreqEst(instPtr);
|
||||||
instPtr->phyLog.recvStamp = (uint64_t)instPtr->recvFsTime.int_part * TIME_FRAC_MAX + instPtr->recvFsTime.frac_part;
|
instPtr->phyLog.recvStamp = (uint64_t)instPtr->recvFsTime.int_part * TIME_FRAC_MAX + instPtr->recvFsTime.frac_part;
|
||||||
instPtr->phyLog.acqPeak = PhyRead(instPtr, PHY_ACQ_PEAK_L);
|
uint64_t peak, avg;
|
||||||
instPtr->phyLog.acqPeak |= ((uint64_t)PhyRead(instPtr, PHY_ACQ_PEAK_H)) << 32;
|
peak = PhyRead(instPtr, PHY_ACQ_PEAK_L);
|
||||||
instPtr->phyLog.acqMean = PhyRead(instPtr, PHY_ACQ_MEAN_L);
|
peak |= ((uint64_t)PhyRead(instPtr, PHY_ACQ_PEAK_H)) << 32;
|
||||||
instPtr->phyLog.acqMean |= ((uint64_t)PhyRead(instPtr, PHY_ACQ_MEAN_H)) << 32;
|
avg = PhyRead(instPtr, PHY_ACQ_MEAN_L);
|
||||||
|
avg |= ((uint64_t)PhyRead(instPtr, PHY_ACQ_MEAN_H)) << 32;
|
||||||
|
instPtr->phyLog.acqPAPR = ((double)peak) / ((double)avg);
|
||||||
instPtr->phyLog.acqPhase = (PhyRead(instPtr, PHY_ACQ_FREQEST) & PHY_ACQ_FREQEST_PHASE_MASK) >> PHY_ACQ_FREQEST_PHASE_SHIFT;
|
instPtr->phyLog.acqPhase = (PhyRead(instPtr, PHY_ACQ_FREQEST) & PHY_ACQ_FREQEST_PHASE_MASK) >> PHY_ACQ_FREQEST_PHASE_SHIFT;
|
||||||
instPtr->phyLog.acqFreqCh = (PhyRead(instPtr, PHY_ACQ_FREQEST) & PHY_ACQ_FREQEST_CHANNEL_MASK) >> PHY_ACQ_FREQEST_CHANNEL_SHIFT;
|
instPtr->phyLog.acqFreqCh = (PhyRead(instPtr, PHY_ACQ_FREQEST) & PHY_ACQ_FREQEST_CHANNEL_MASK) >> PHY_ACQ_FREQEST_CHANNEL_SHIFT;
|
||||||
instPtr->phyLog.fsyncPeak = PhyRead(instPtr, PHY_FRAME_SYNC_PEAK_L);
|
peak = PhyRead(instPtr, PHY_FRAME_SYNC_PEAK_L);
|
||||||
instPtr->phyLog.fsyncPeak |= ((uint64_t)PhyRead(instPtr, PHY_FRAME_SYNC_PEAK_H)) << 32;
|
peak |= ((uint64_t)PhyRead(instPtr, PHY_FRAME_SYNC_PEAK_H)) << 32;
|
||||||
instPtr->phyLog.fsyncMean = PhyRead(instPtr, PHY_FRAME_SYNC_MEAN_L);
|
avg = PhyRead(instPtr, PHY_FRAME_SYNC_MEAN_L);
|
||||||
instPtr->phyLog.fsyncMean |= ((uint64_t)PhyRead(instPtr, PHY_FRAME_SYNC_MEAN_H)) << 32;
|
avg |= ((uint64_t)PhyRead(instPtr, PHY_FRAME_SYNC_MEAN_H)) << 32;
|
||||||
|
instPtr->phyLog.fsyncPAPR = ((double)peak) / ((double)avg);
|
||||||
instPtr->phyLog.fsyncFreqCh = (PhyRead(instPtr, PHY_FRAME_SYNC_FREQEST) & PHY_FRAME_SYNC_FREQEST_CHANNEL_MASK) >> PHY_FRAME_SYNC_FREQEST_CHANNEL_SHIFT;
|
instPtr->phyLog.fsyncFreqCh = (PhyRead(instPtr, PHY_FRAME_SYNC_FREQEST) & PHY_FRAME_SYNC_FREQEST_CHANNEL_MASK) >> PHY_FRAME_SYNC_FREQEST_CHANNEL_SHIFT;
|
||||||
instPtr->phyLog.deintlvAmpEst = PhyRead(instPtr, PHY_DEINTLV_AMPEST) & PHY_DEINTLV_AMPEST_MASK;
|
instPtr->phyLog.deintlvAmpEst = PhyRead(instPtr, PHY_DEINTLV_AMPEST) & PHY_DEINTLV_AMPEST_MASK;
|
||||||
instPtr->phyLog.reserve = 0;
|
memset(instPtr->phyLog.reserve, 0x00, sizeof(instPtr->phyLog.reserve));
|
||||||
|
|
||||||
SysMonitor_UpdatePhysicalLayerLog(&(instPtr->phyLog));
|
SysMonitor_UpdatePhysicalLayerLog(&(instPtr->phyLog));
|
||||||
}
|
}
|
||||||
@@ -1143,58 +1145,88 @@ void Phy_RefreshHwSate(PHY_INST *instPtr)
|
|||||||
#ifndef EMULATION
|
#ifndef EMULATION
|
||||||
float evalData;
|
float evalData;
|
||||||
instPtr->hwSate.isSpOk = true;
|
instPtr->hwSate.isSpOk = true;
|
||||||
// -- Update Ps voltage, unit mV
|
// -- Update FPGA voltage status;
|
||||||
|
instPtr->hwSate.spFpgaVolt = 0;
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPINT);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPINT);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spPsVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_PS_VALID(evalData)) ? VOLT_PS_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_PS_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update Ps aux voltage, unit mV
|
// -- -- Update Ps aux voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPAUX);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPAUX);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spPsAuxVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_PSAUX_VALID(evalData)) ? VOLT_PSAUX_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_PSAUX_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update DDR voltage, unit mV
|
// -- -- Update DDR voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPDRO);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPDRO);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spDdrVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_DDR_VALID(evalData)) ? VOLT_DDR_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_DDR_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update PL voltage, unit mV
|
// -- -- Update PL voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCINT);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCINT);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spPlVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_PL_VALID(evalData)) ? VOLT_PL_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_PL_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update PL aux voltage, unit mV
|
// -- -- Update PL aux voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCAUX);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCAUX);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spPlAuxVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_PLAUX_VALID(evalData)) ? VOLT_PLAUX_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_PLAUX_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update Bram voltage, unit mV
|
// -- -- Update Bram voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VBRAM);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VBRAM);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spBramVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_BRAM_VALID(evalData)) ? VOLT_BRAM_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_BRAM_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update Chip temperature, unit 0.01 deg
|
// -- Update clock lock state
|
||||||
|
if (instPtr->phyCofig.get_clk_state != NULL)
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spClkState = instPtr->phyCofig.get_clk_state();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spClkState = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Update AD9361 pll lock state
|
||||||
|
if (instPtr->phyCofig.get_ad_lock_state != NULL)
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdLockState = instPtr->phyCofig.get_ad_lock_state();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdLockState = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Update AD9361-0 temperature, unit 1 Celcius degree
|
||||||
|
if (instPtr->phyCofig.get_ad0_temp != NULL)
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdTemp_0 = instPtr->phyCofig.get_ad0_temp();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdTemp_0 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Update AD9361-1 temperature, unit 1 Celcius degree
|
||||||
|
if (instPtr->phyCofig.get_ad1_temp != NULL)
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdTemp_1 = instPtr->phyCofig.get_ad1_temp();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdTemp_1 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Update FPGA Chip temperature, unit 1 deg
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_TEMP);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_TEMP);
|
||||||
evalData = XAdcPs_RawToTemperature(rawData);
|
evalData = XAdcPs_RawToTemperature(rawData);
|
||||||
instPtr->hwSate.spTemp = (evalData > TEMPERATURE_MAX)
|
instPtr->hwSate.spFpgaTemp = (evalData > TEMPERATURE_MAX)
|
||||||
? INT8_MAX
|
? INT8_MAX
|
||||||
: ((evalData < TEMPERATURE_MIN) ? INT8_MIN : (int8_t) round(evalData/TEMPERATURE_LSB));
|
: ((evalData < TEMPERATURE_MIN) ? INT8_MIN : (int8_t) round(evalData/TEMPERATURE_LSB));
|
||||||
|
instPtr->hwSate.isSpOk = (instPtr->hwSate.spFpgaVolt == (VOLT_PS_OK & VOLT_PSAUX_OK & VOLT_DDR_OK & VOLT_PL_OK & VOLT_PLAUX_OK & VOLT_BRAM_OK))
|
||||||
|
&& (instPtr->hwSate.spClkState == (CLK_SP_PLL0_LOCK & CLK_SP_PLL1_LOCK))
|
||||||
|
&& (instPtr->hwSate.spAdLockState == (CLK_AD0_BBPLL_LOCK && CLK_AD0_RFPLL_LOCK & CLK_AD1_BBPLL_LOCK & CLK_AD1_RFPLL_LOCK));
|
||||||
#else
|
#else
|
||||||
instPtr->spPsVolt = 0;
|
instPtr->hwSate.isSpOk = true;
|
||||||
instPtr->spPsAuxVolt = 0;
|
|
||||||
instPtr->spDdrVolt = 0;
|
|
||||||
instPtr->spPlVolt = 0;
|
|
||||||
instPtr->spPlAuxVolt = 0;
|
|
||||||
instPtr->spBramVolt = 0;
|
|
||||||
instPtr->spTemp = 0;
|
|
||||||
instPtr->isSpOk = true;
|
|
||||||
#endif
|
#endif
|
||||||
/*** Voltage and Status ***/
|
/*** Voltage and Status ***/
|
||||||
rawData = PhyRead(instPtr, ANT_STATUS);
|
rawData = PhyRead(instPtr, ANT_STATUS);
|
||||||
@@ -1203,10 +1235,10 @@ void Phy_RefreshHwSate(PHY_INST *instPtr)
|
|||||||
// [2] - RF voltage status
|
// [2] - RF voltage status
|
||||||
// [4] - NIL voltage status
|
// [4] - NIL voltage status
|
||||||
// [6] - Antenna status
|
// [6] - Antenna status
|
||||||
instPtr->hwSate.antVolt = ((rawData & ANT_STATUS_ANT_VOLT_MASK) == ANT_STATUS_ANT_VOLT_OK) ? 0x01 : 0x00;
|
instPtr->hwSate.antVolt = ((rawData & ANT_STATUS_ANT_VOLT_MASK) == ANT_STATUS_ANT_VOLT_OK) ? VOLT_ANT_PROC_OK : 0x00;
|
||||||
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_RF_VOLT_MASK) == ANT_STATUS_RF_VOLT_OK) ? 0x04 : 0x00;
|
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_RF_VOLT_MASK) == ANT_STATUS_RF_VOLT_OK) ? VOLT_ANT_RF_OK : 0x00;
|
||||||
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_NIL_VOLT_MASK) == ANT_STATUS_NIL_VOLT_OK) ? 0x10 : 0x00;
|
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_NIL_VOLT_MASK) == ANT_STATUS_NIL_VOLT_OK) ? VOLT_ANT_NIL_OK : 0x00;
|
||||||
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_CODE_MASK) == ANT_STATUS_CODE_OK) ? 0x40 : 0x00;
|
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_CODE_MASK) == ANT_STATUS_CODE_OK) ? ANT_STATE_OK : 0x00;
|
||||||
|
|
||||||
/*** Temperature and Lock Status ***/
|
/*** Temperature and Lock Status ***/
|
||||||
rawData = PhyRead(instPtr, ANT_RF_STATUS);
|
rawData = PhyRead(instPtr, ANT_RF_STATUS);
|
||||||
@@ -1216,9 +1248,9 @@ void Phy_RefreshHwSate(PHY_INST *instPtr)
|
|||||||
// [0] - BASEBAND lock status
|
// [0] - BASEBAND lock status
|
||||||
// [2] - PLLA lock status
|
// [2] - PLLA lock status
|
||||||
// [4] - PLLB lock status
|
// [4] - PLLB lock status
|
||||||
instPtr->hwSate.antPll = ((rawData & ANT_RF_STATUS_BBLOCK_MASK) == ANT_RF_STATUS_BBLOCK_OK) ? 0x01 : 0x00;
|
instPtr->hwSate.antPll = ((rawData & ANT_RF_STATUS_BBLOCK_MASK) == ANT_RF_STATUS_BBLOCK_OK) ? CLK_ANT_BBPLL_LOCK : 0x00;
|
||||||
instPtr->hwSate.antPll |= ((rawData & ANT_RF_STATUS_PLLA_MASK) == ANT_RF_STATUS_PLLA_OK) ? 0x04 : 0x00;
|
instPtr->hwSate.antPll |= ((rawData & ANT_RF_STATUS_PLLA_MASK) == ANT_RF_STATUS_PLLA_OK) ? CLK_ANT_RFPLL0_LOCK : 0x00;
|
||||||
instPtr->hwSate.antPll |= ((rawData & ANT_RF_STATUS_PLLB_MASK) == ANT_RF_STATUS_PLLB_OK) ? 0x10 : 0x00;
|
instPtr->hwSate.antPll |= ((rawData & ANT_RF_STATUS_PLLB_MASK) == ANT_RF_STATUS_PLLB_OK) ? CLK_ANT_RFPLL1_LOCK : 0x00;
|
||||||
|
|
||||||
/*** MGCs ***/
|
/*** MGCs ***/
|
||||||
rawData = PhyRead(instPtr, ANT_RF_MGC);
|
rawData = PhyRead(instPtr, ANT_RF_MGC);
|
||||||
@@ -1233,14 +1265,10 @@ void Phy_RefreshHwSate(PHY_INST *instPtr)
|
|||||||
instPtr->hwSate.antMgc1 |= (rawData & ANT_RF_MGC_CH4_MASK) >> 24;
|
instPtr->hwSate.antMgc1 |= (rawData & ANT_RF_MGC_CH4_MASK) >> 24;
|
||||||
|
|
||||||
// Determin if antenna is ok.
|
// Determin if antenna is ok.
|
||||||
if(instPtr->hwSate.antVolt != 0x55 //01010101
|
instPtr->hwSate.isAntOk = (instPtr->hwSate.antVolt == (VOLT_ANT_PROC_OK & VOLT_ANT_RF_OK & VOLT_ANT_NIL_OK & ANT_STATE_OK))
|
||||||
||instPtr->hwSate.antPll != 0x15) // 00010101
|
&& (instPtr->hwSate.antPll == (CLK_ANT_BBPLL_LOCK & CLK_ANT_RFPLL0_LOCK & CLK_ANT_RFPLL1_LOCK));
|
||||||
{
|
|
||||||
instPtr->hwSate.isSpOk = false;
|
memset(instPtr->hwSate.reserve, 0x00, sizeof(instPtr->hwSate.reserve));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
instPtr->hwSate.isSpOk = true;
|
|
||||||
}
|
|
||||||
SysMonitor_UpdateHardwareStatus(&(instPtr->hwSate));
|
SysMonitor_UpdateHardwareStatus(&(instPtr->hwSate));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,6 +183,12 @@ typedef struct
|
|||||||
uint32_t antBramId;
|
uint32_t antBramId;
|
||||||
uint32_t hwXadcId;
|
uint32_t hwXadcId;
|
||||||
uintptr_t baseAddr;
|
uintptr_t baseAddr;
|
||||||
|
#ifndef EMULATION
|
||||||
|
uint8_t (*get_clk_state)(void);
|
||||||
|
uint8_t (*get_ad_lock_state)(void);
|
||||||
|
int8_t (*get_ad0_temp)(void);
|
||||||
|
int8_t (*get_ad1_temp)(void);
|
||||||
|
#endif
|
||||||
} PHY_CONFIG;
|
} PHY_CONFIG;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|||||||
@@ -289,16 +289,3 @@ void SysMonitor_GetHardwareStatus(HWSTATE *state)
|
|||||||
memcpy(state, &(sysMonitorInst->hwState[buffIndx]), sizeof(HWSTATE));
|
memcpy(state, &(sysMonitorInst->hwState[buffIndx]), sizeof(HWSTATE));
|
||||||
sysMonitorInst->hwStateCtrl.rBusy = buffIndex_old;
|
sysMonitorInst->hwStateCtrl.rBusy = buffIndex_old;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @System log
|
|
||||||
/**
|
|
||||||
* Get the latest system running log.
|
|
||||||
*/
|
|
||||||
void SysMonitor_GetSyslog(SYSLOG *log)
|
|
||||||
{
|
|
||||||
ASSERT(sysMonitorInst != NULL);
|
|
||||||
SysMonitor_GetLinklayerLog(&(log->linkLog));
|
|
||||||
SysMonitor_GetPhysicalLayerLog(&(log->phyLog));
|
|
||||||
SysMonitor_GetHardwareStatus(&(log->hwState));
|
|
||||||
}
|
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#define PAYLOAD_LEN_MAX 256
|
#define PAYLOAD_LEN_MAX 256
|
||||||
#define PAYLOAD_LEN_FLJ_RX 168
|
#define PAYLOAD_LEN_FLJ_RX 168
|
||||||
@@ -23,6 +24,18 @@
|
|||||||
#define VOLT_PLAUX_STD 1.8
|
#define VOLT_PLAUX_STD 1.8
|
||||||
#define VOLT_BRAM_STD 1.0
|
#define VOLT_BRAM_STD 1.0
|
||||||
|
|
||||||
|
#define VOLT_PS_OK BIT(0)
|
||||||
|
#define VOLT_PSAUX_OK BIT(1)
|
||||||
|
#define VOLT_DDR_OK BIT(2)
|
||||||
|
#define VOLT_PL_OK BIT(3)
|
||||||
|
#define VOLT_PLAUX_OK BIT(4)
|
||||||
|
#define VOLT_BRAM_OK BIT(5)
|
||||||
|
|
||||||
|
#define VOLT_ANT_PROC_OK BIT(0)
|
||||||
|
#define VOLT_ANT_RF_OK BIT(2)
|
||||||
|
#define VOLT_ANT_NIL_OK BIT(4)
|
||||||
|
#define ANT_STATE_OK BIT(6)
|
||||||
|
|
||||||
#define IS_PS_VALID(x) (x <= 0.95 && x >= 1.05)
|
#define IS_PS_VALID(x) (x <= 0.95 && x >= 1.05)
|
||||||
#define IS_PSAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
#define IS_PSAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
||||||
#define IS_DDR_VALID(x) (x <= 1.14 && x >= 1.89)
|
#define IS_DDR_VALID(x) (x <= 1.14 && x >= 1.89)
|
||||||
@@ -30,8 +43,20 @@
|
|||||||
#define IS_PLAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
#define IS_PLAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
||||||
#define IS_BRAM_VALID(x) (x <= 0.97 && x >= 1.03)
|
#define IS_BRAM_VALID(x) (x <= 0.97 && x >= 1.03)
|
||||||
|
|
||||||
#define TEMPERATURE_LSB 1.0 // Celsius degree
|
#define CLK_SP_PLL0_LOCK BIT(0)
|
||||||
#define TEMPERATURE_MAX 127.0 // Celsius degree
|
#define CLK_SP_PLL1_LOCK BIT(2)
|
||||||
|
|
||||||
|
#define CLK_AD0_BBPLL_LOCK BIT(0)
|
||||||
|
#define CLK_AD0_RFPLL_LOCK BIT(2)
|
||||||
|
#define CLK_AD1_BBPLL_LOCK BIT(4)
|
||||||
|
#define CLK_AD1_RFPLL_LOCK BIT(6)
|
||||||
|
|
||||||
|
#define CLK_ANT_BBPLL_LOCK BIT(0)
|
||||||
|
#define CLK_ANT_RFPLL0_LOCK BIT(2)
|
||||||
|
#define CLK_ANT_RFPLL1_LOCK BIT(4)
|
||||||
|
|
||||||
|
#define TEMPERATURE_LSB 1.0 // Celsius degree
|
||||||
|
#define TEMPERATURE_MAX 127.0 // Celsius degree
|
||||||
#define TEMPERATURE_MIN -128.0 // Celsius degree
|
#define TEMPERATURE_MIN -128.0 // Celsius degree
|
||||||
|
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
@@ -73,6 +98,18 @@ typedef struct __attribute__((packed))
|
|||||||
float roll;
|
float roll;
|
||||||
} SYSINFO;
|
} SYSINFO;
|
||||||
|
|
||||||
|
typedef struct __attribute__((packed))
|
||||||
|
{
|
||||||
|
// SystemBus log
|
||||||
|
// -- last valid config
|
||||||
|
// byte 0: 0x11 FLJ, 0x00 LJ
|
||||||
|
// byte 1: 0x66 Full Power, 0x88 Low Power
|
||||||
|
uint8_t lastConfig[2];
|
||||||
|
uint32_t pollCnt;
|
||||||
|
uint32_t svcCnt;
|
||||||
|
uint32_t remoteCnt;
|
||||||
|
} SYSBUSLOG;
|
||||||
|
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
{
|
{
|
||||||
// Network log
|
// Network log
|
||||||
@@ -95,9 +132,10 @@ typedef struct __attribute__((packed))
|
|||||||
uint32_t svcTxCnt;
|
uint32_t svcTxCnt;
|
||||||
uint32_t svcRecvCnt;
|
uint32_t svcRecvCnt;
|
||||||
uint32_t svcCorrectCnt;
|
uint32_t svcCorrectCnt;
|
||||||
int64_t timeDev;
|
int32_t timeDev;
|
||||||
uint32_t sendId;
|
uint32_t sendId;
|
||||||
uint32_t recvId;
|
uint32_t recvId;
|
||||||
|
uint8_t reserve[4];
|
||||||
} LINKLOG;
|
} LINKLOG;
|
||||||
|
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
@@ -108,15 +146,13 @@ typedef struct __attribute__((packed))
|
|||||||
uint32_t crcCnt;
|
uint32_t crcCnt;
|
||||||
double doppler;
|
double doppler;
|
||||||
uint64_t recvStamp;
|
uint64_t recvStamp;
|
||||||
uint64_t acqPeak;
|
double acqPAPR;
|
||||||
uint64_t acqMean;
|
|
||||||
uint8_t acqPhase;
|
uint8_t acqPhase;
|
||||||
uint8_t acqFreqCh;
|
uint8_t acqFreqCh;
|
||||||
uint64_t fsyncPeak;
|
double fsyncPAPR;
|
||||||
uint64_t fsyncMean;
|
|
||||||
uint8_t fsyncFreqCh;
|
uint8_t fsyncFreqCh;
|
||||||
uint16_t deintlvAmpEst;
|
uint16_t deintlvAmpEst;
|
||||||
uint16_t reserve;
|
uint8_t reserve[4];
|
||||||
} PHYLOG;
|
} PHYLOG;
|
||||||
|
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
@@ -125,34 +161,21 @@ typedef struct __attribute__((packed))
|
|||||||
bool isSpOk;
|
bool isSpOk;
|
||||||
bool isAntOk;
|
bool isAntOk;
|
||||||
// -- Signal processor status
|
// -- Signal processor status
|
||||||
uint8_t spPsVolt;
|
uint8_t spFpgaVolt;
|
||||||
uint8_t spPsAuxVolt;
|
uint8_t spClkState;
|
||||||
uint8_t spDdrVolt;
|
uint8_t spAdLockState;
|
||||||
uint8_t spPlVolt;
|
uint8_t spAdTemp_0;
|
||||||
uint8_t spPlAuxVolt;
|
uint8_t spAdTemp_1;
|
||||||
uint8_t spBramVolt;
|
uint8_t spFpgaTemp;
|
||||||
int8_t spTemp;
|
|
||||||
// -- Antenna status
|
// -- Antenna status
|
||||||
uint8_t antVolt;
|
uint8_t antVolt;
|
||||||
uint8_t antTemp;
|
uint8_t antTemp;
|
||||||
uint8_t antPll;
|
uint8_t antPll;
|
||||||
uint8_t antMgc0;
|
uint8_t antMgc0;
|
||||||
uint8_t antMgc1;
|
uint8_t antMgc1;
|
||||||
uint8_t dummy;
|
uint8_t reserve[2];
|
||||||
} HWSTATE;
|
} HWSTATE;
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
// Link layer log
|
|
||||||
LINKLOG linkLog;
|
|
||||||
|
|
||||||
// Physical layer log
|
|
||||||
PHYLOG phyLog;
|
|
||||||
|
|
||||||
// Hardware status
|
|
||||||
HWSTATE hwState;
|
|
||||||
} SYSLOG;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t dataId;
|
uint32_t dataId;
|
||||||
@@ -177,6 +200,4 @@ void SysMonitor_GetLinklayerLog(LINKLOG *log);
|
|||||||
void SysMonitor_GetPhysicalLayerLog(PHYLOG *log);
|
void SysMonitor_GetPhysicalLayerLog(PHYLOG *log);
|
||||||
void SysMonitor_GetHardwareStatus(HWSTATE *state);
|
void SysMonitor_GetHardwareStatus(HWSTATE *state);
|
||||||
|
|
||||||
void SysMonitor_GetSyslog(SYSLOG *log);
|
|
||||||
|
|
||||||
#endif //__SYSTEM_MONITOR_H_
|
#endif //__SYSTEM_MONITOR_H_
|
||||||
|
|||||||
@@ -53,31 +53,30 @@
|
|||||||
#define ST_RET_ERROR 0x55
|
#define ST_RET_ERROR 0x55
|
||||||
#define ST_RET_INFO_LEN 13
|
#define ST_RET_INFO_LEN 13
|
||||||
// -- -- Signal processor PS voltage
|
// -- -- Signal processor PS voltage
|
||||||
#define WD_SP_PS_VOLT 0x03
|
#define WD_SP_FPGA_VOLT 0x03
|
||||||
// -- -- Signal processor PS AUX voltage
|
// -- -- Signal processor PS AUX voltage
|
||||||
#define WD_SP_PSAUX_VOLT 0x04
|
#define WD_SP_CLK_STATE 0x04
|
||||||
// -- -- Signal processor DDR voltage
|
// -- -- Signal processor DDR voltage
|
||||||
#define WD_SP_DDR_VOLT 0x05
|
#define WD_SP_AD_LOCK_STATE 0x05
|
||||||
// -- -- Signal processor PL voltage
|
// -- -- Signal processor PL voltage
|
||||||
#define WD_SP_PL_VOLT 0x06
|
#define WD_SP_AD_TEMP_0 0x06
|
||||||
// -- -- Signal processor PL AUX voltage
|
// -- -- Signal processor PL AUX voltage
|
||||||
#define WD_SP_PLAUX_VOLT 0x07
|
#define WD_SP_AD_TEMP_1 0x07
|
||||||
// -- -- Signal processor Bram voltage
|
// -- -- Signal processor Bram voltage
|
||||||
#define WD_SP_BRAM_VOLT 0x08
|
#define WD_SP_FPGA_TEMP 0x08
|
||||||
// -- -- Signal processor temperature
|
|
||||||
#define WD_SP_TEMP 0x09
|
|
||||||
|
|
||||||
// -- -- Signal processor antenna voltage status
|
// -- -- Signal processor antenna voltage status
|
||||||
#define WD_ANT_VOLT 0x0A
|
#define WD_ANT_VOLT 0x09
|
||||||
|
|
||||||
// -- -- Signal processor antenna RF temperature
|
// -- -- Signal processor antenna RF temperature
|
||||||
#define WD_ANT_RF_TEMP 0x0B
|
#define WD_ANT_RF_TEMP 0x0A
|
||||||
// -- -- Signal processor antenna PLL lock status
|
// -- -- Signal processor antenna PLL lock status
|
||||||
#define WD_ANT_RF_PLL 0x0C
|
#define WD_ANT_RF_PLL 0x0B
|
||||||
// -- -- Signal processor antenna MGC
|
// -- -- Signal processor antenna MGC
|
||||||
#define WD_ANT_MGC_0 0x0D
|
#define WD_ANT_MGC_0 0x0C
|
||||||
#define WD_ANT_MGC_1 0x0E
|
#define WD_ANT_MGC_1 0x0D
|
||||||
// -- -- Dummy must be 0x00
|
// -- -- Reserved
|
||||||
#define WD_ST_DUMMY 0x0F
|
#define WD_ANT_RESERVE 0x0E
|
||||||
|
|
||||||
// Data Send Test Command
|
// Data Send Test Command
|
||||||
#define CMD_DATA_TEST_A 0xE2
|
#define CMD_DATA_TEST_A 0xE2
|
||||||
@@ -160,10 +159,12 @@
|
|||||||
// -- Response
|
// -- Response
|
||||||
#define WD_FLJ_TIME_STAMP 0x02
|
#define WD_FLJ_TIME_STAMP 0x02
|
||||||
#define WD_FLJ_TIME_STAMP_LEN 8
|
#define WD_FLJ_TIME_STAMP_LEN 8
|
||||||
#define WD_FLJ_LINK_LOG 0x0A
|
#define WD_FLJ_SYSBUS_LOG 0x0A
|
||||||
|
#define WD_FLJ_SYSBUS_LOG_LEN 14
|
||||||
|
#define WD_FLJ_LINK_LOG 0x18
|
||||||
#define WD_FLJ_LINK_LOG_LEN 64
|
#define WD_FLJ_LINK_LOG_LEN 64
|
||||||
#define WD_FLJ_PHY_LOG 0x4A
|
#define WD_FLJ_PHY_LOG 0x58
|
||||||
#define WD_FLJ_PHY_LOG_LEN 71
|
#define WD_FLJ_PHY_LOG_LEN 57
|
||||||
#define WD_FLJ_HARDWARE_ST 0x91
|
#define WD_FLJ_HARDWARE_ST 0x91
|
||||||
#define WD_FLJ_HARDWARE_ST_LEN 13
|
#define WD_FLJ_HARDWARE_ST_LEN 13
|
||||||
|
|
||||||
@@ -177,10 +178,12 @@
|
|||||||
// -- Response
|
// -- Response
|
||||||
#define WD_LJ_TIME_STAMP 0x02
|
#define WD_LJ_TIME_STAMP 0x02
|
||||||
#define WD_LJ_TIME_STAMP_LEN 8
|
#define WD_LJ_TIME_STAMP_LEN 8
|
||||||
#define WD_LJ_LINK_LOG 0x0A
|
#define WD_LJ_SYSBUS_LOG 0x0A
|
||||||
|
#define WD_LJ_SYSBUS_LOG_LEN 14
|
||||||
|
#define WD_LJ_LINK_LOG 0x18
|
||||||
#define WD_LJ_LINK_LOG_LEN 64
|
#define WD_LJ_LINK_LOG_LEN 64
|
||||||
#define WD_LJ_PHY_LOG 0x4A
|
#define WD_LJ_PHY_LOG 0x58
|
||||||
#define WD_LJ_PHY_LOG_LEN 71
|
#define WD_LJ_PHY_LOG_LEN 57
|
||||||
#define WD_LJ_HARDWARE_ST 0x91
|
#define WD_LJ_HARDWARE_ST 0x91
|
||||||
#define WD_LJ_HARDWARE_ST_LEN 13
|
#define WD_LJ_HARDWARE_ST_LEN 13
|
||||||
|
|
||||||
@@ -247,7 +250,10 @@ int32_t SystemBus_Init(SYSBUS **instPtr, SYSBUS_CONFIG *config)
|
|||||||
(*instPtr)->txQueue = NULL;
|
(*instPtr)->txQueue = NULL;
|
||||||
(*instPtr)->uartInst = NULL;
|
(*instPtr)->uartInst = NULL;
|
||||||
memcpy(&((*instPtr)->config), config, sizeof(SYSBUS_CONFIG));
|
memcpy(&((*instPtr)->config), config, sizeof(SYSBUS_CONFIG));
|
||||||
memset(&((*instPtr)->sysLog), 0x00, sizeof(SYSLOG));
|
memset(&((*instPtr)->sysbusLog), 0x00, sizeof(SYSBUSLOG));
|
||||||
|
memset(&((*instPtr)->linkLog), 0x00, sizeof(LINKLOG));
|
||||||
|
memset(&((*instPtr)->phyLog), 0x00, sizeof(PHYLOG));
|
||||||
|
memset(&((*instPtr)->hwState), 0x00, sizeof(HWSTATE));
|
||||||
uartConfig.baseAddr = config->baseAddr;
|
uartConfig.baseAddr = config->baseAddr;
|
||||||
Status = SysbusUart_Init(&((*instPtr)->uartInst), &uartConfig);
|
Status = SysbusUart_Init(&((*instPtr)->uartInst), &uartConfig);
|
||||||
if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
@@ -304,11 +310,12 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
DBG_WARNING("SystemBus::Production code mismatch!\n");
|
DBG_WARNING("SystemBus::Production code mismatch!\n");
|
||||||
return EIGNORE;
|
return EIGNORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (data[WD_CMD])
|
switch (data[WD_CMD])
|
||||||
{
|
{
|
||||||
case CMD_SELF_TEST:
|
case CMD_SELF_TEST:
|
||||||
{
|
{
|
||||||
HWSTATE *hwStatsPtr = &(instPtr->sysLog.hwState);
|
HWSTATE *hwStatsPtr = &(instPtr->hwState);
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||||
if (sysbusRsp == NULL) {
|
if (sysbusRsp == NULL) {
|
||||||
DBG_ERROR("Failed to allocate memory for SELF TEST Response!\n");
|
DBG_ERROR("Failed to allocate memory for SELF TEST Response!\n");
|
||||||
@@ -329,7 +336,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
sysbusRsp->data[WD_ST_RET] = (hwStatsPtr->isSpOk && hwStatsPtr->isAntOk) ? ST_RET_OK : ST_RET_ERROR;
|
sysbusRsp->data[WD_ST_RET] = (hwStatsPtr->isSpOk && hwStatsPtr->isAntOk) ? ST_RET_OK : ST_RET_ERROR;
|
||||||
}
|
}
|
||||||
// apply status and omit 2 bytes of overhead.
|
// apply status and omit 2 bytes of overhead.
|
||||||
memcpy(sysbusRsp->data + WD_SP_PS_VOLT, &(hwStatsPtr->spPsVolt), ST_RET_INFO_LEN);
|
memcpy(sysbusRsp->data + WD_SP_FPGA_VOLT, &(hwStatsPtr->spFpgaVolt), ST_RET_INFO_LEN);
|
||||||
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
||||||
{
|
{
|
||||||
@@ -449,6 +456,8 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Linklayer_Start(linkInstPtr);
|
Linklayer_Start(linkInstPtr);
|
||||||
|
instPtr->sysbusLog.lastConfig[0] = data[WD_MODE_CMD];
|
||||||
|
instPtr->sysbusLog.lastConfig[1] = data[WD_EN_CMD];
|
||||||
Status = SUCCESS;
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -462,11 +471,13 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
case CMD_FLJ_SEND:
|
case CMD_FLJ_SEND:
|
||||||
{
|
{
|
||||||
SysMonitor_UpdateSendPayload(data + FLJ_DATA_OFFSET, PAYLOAD_LEN_FLJ_TX); // omit control info
|
SysMonitor_UpdateSendPayload(data + FLJ_DATA_OFFSET, PAYLOAD_LEN_FLJ_TX); // omit control info
|
||||||
|
instPtr->sysbusLog.svcCnt++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_LJ_SEND:
|
case CMD_LJ_SEND:
|
||||||
{
|
{
|
||||||
SysMonitor_UpdateSendPayload(data + LJ_DATA_OFFSET, PAYLOAD_LEN_LJ_TX); // omit control info
|
SysMonitor_UpdateSendPayload(data + LJ_DATA_OFFSET, PAYLOAD_LEN_LJ_TX); // omit control info
|
||||||
|
instPtr->sysbusLog.svcCnt++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_FLJ_POLL:
|
case CMD_FLJ_POLL:
|
||||||
@@ -502,6 +513,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
Status = EQUEUE;
|
Status = EQUEUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
instPtr->sysbusLog.pollCnt++;
|
||||||
Status = SUCCESS;
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -538,12 +550,12 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
Status = EQUEUE;
|
Status = EQUEUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
instPtr->sysbusLog.pollCnt++;
|
||||||
Status = SUCCESS;
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_FLJ_RM_TEST:
|
case CMD_FLJ_RM_TEST:
|
||||||
{
|
{
|
||||||
SYSLOG *sysLogPtr = &(instPtr->sysLog);
|
|
||||||
if (data[WD_FLJ_RM_TEST] != FLJ_RM_TEST_CODE)
|
if (data[WD_FLJ_RM_TEST] != FLJ_RM_TEST_CODE)
|
||||||
{
|
{
|
||||||
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
||||||
@@ -567,10 +579,12 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
||||||
time = tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
time = tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
||||||
memcpy(sysbusRsp->data + WD_FLJ_TIME_STAMP, &time, WD_FLJ_TIME_STAMP_LEN);
|
memcpy(sysbusRsp->data + WD_FLJ_TIME_STAMP, &time, WD_FLJ_TIME_STAMP_LEN);
|
||||||
SysMonitor_GetSyslog(sysLogPtr);
|
SysMonitor_GetLinklayerLog(&(instPtr->linkLog));
|
||||||
memcpy(sysbusRsp->data + WD_FLJ_LINK_LOG, &(sysLogPtr->linkLog), WD_FLJ_LINK_LOG_LEN);
|
SysMonitor_GetPhysicalLayerLog(&(instPtr->phyLog));
|
||||||
memcpy(sysbusRsp->data + WD_FLJ_PHY_LOG, &(sysLogPtr->phyLog), WD_FLJ_PHY_LOG_LEN);
|
SysMonitor_GetHardwareStatus(&(instPtr->hwState));
|
||||||
memcpy(sysbusRsp->data + WD_FLJ_HARDWARE_ST, &(sysLogPtr->hwState.spPsVolt), WD_FLJ_HARDWARE_ST_LEN);
|
memcpy(sysbusRsp->data + WD_FLJ_LINK_LOG, &(instPtr->linkLog), WD_FLJ_LINK_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_FLJ_PHY_LOG, &(instPtr->phyLog), WD_FLJ_PHY_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_FLJ_HARDWARE_ST, &(instPtr->hwState.spFpgaVolt), WD_FLJ_HARDWARE_ST_LEN);
|
||||||
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){
|
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){
|
||||||
free(sysbusRsp);
|
free(sysbusRsp);
|
||||||
@@ -578,12 +592,12 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
Status = EQUEUE;
|
Status = EQUEUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
instPtr->sysbusLog.remoteCnt++;
|
||||||
Status = SUCCESS;
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_LJ_RM_TEST:
|
case CMD_LJ_RM_TEST:
|
||||||
{
|
{
|
||||||
SYSLOG *sysLogPtr = &(instPtr->sysLog);
|
|
||||||
if (data[WD_LJ_RM_TEST] != LJ_RM_TEST_CODE)
|
if (data[WD_LJ_RM_TEST] != LJ_RM_TEST_CODE)
|
||||||
{
|
{
|
||||||
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
||||||
@@ -607,10 +621,12 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
||||||
time = tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
time = tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
||||||
memcpy(sysbusRsp->data + WD_LJ_TIME_STAMP, &time, WD_LJ_TIME_STAMP_LEN);
|
memcpy(sysbusRsp->data + WD_LJ_TIME_STAMP, &time, WD_LJ_TIME_STAMP_LEN);
|
||||||
SysMonitor_GetSyslog(sysLogPtr);
|
SysMonitor_GetLinklayerLog(&(instPtr->linkLog));
|
||||||
memcpy(sysbusRsp->data + WD_LJ_LINK_LOG, &(sysLogPtr->linkLog), WD_LJ_LINK_LOG_LEN);
|
SysMonitor_GetPhysicalLayerLog(&(instPtr->phyLog));
|
||||||
memcpy(sysbusRsp->data + WD_LJ_PHY_LOG, &(sysLogPtr->phyLog), WD_LJ_PHY_LOG_LEN);
|
SysMonitor_GetHardwareStatus(&(instPtr->hwState));
|
||||||
memcpy(sysbusRsp->data + WD_LJ_HARDWARE_ST, &(sysLogPtr->hwState.spPsVolt), WD_LJ_HARDWARE_ST_LEN);
|
memcpy(sysbusRsp->data + WD_LJ_LINK_LOG, &(instPtr->linkLog), WD_LJ_LINK_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_LJ_PHY_LOG, &(instPtr->phyLog), WD_LJ_PHY_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_LJ_HARDWARE_ST, &(instPtr->hwState.spFpgaVolt), WD_LJ_HARDWARE_ST_LEN);
|
||||||
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){
|
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){
|
||||||
free(sysbusRsp);
|
free(sysbusRsp);
|
||||||
@@ -618,6 +634,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
Status = EQUEUE;
|
Status = EQUEUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
instPtr->sysbusLog.remoteCnt++;
|
||||||
Status = SUCCESS;
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,10 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
SYSBUS_CONFIG config;
|
SYSBUS_CONFIG config;
|
||||||
SYSLOG sysLog;
|
SYSBUSLOG sysbusLog; // systembus log
|
||||||
|
LINKLOG linkLog; // Link layer log
|
||||||
|
PHYLOG phyLog; // Physical layer log
|
||||||
|
HWSTATE hwState; // Hardware status
|
||||||
SYSBUS_UART *uartInst;
|
SYSBUS_UART *uartInst;
|
||||||
CIRC_QUEUE *txQueue;
|
CIRC_QUEUE *txQueue;
|
||||||
CIRC_QUEUE *rxQueue;
|
CIRC_QUEUE *rxQueue;
|
||||||
|
|||||||
Reference in New Issue
Block a user