1026 lines
33 KiB
C
Executable File
1026 lines
33 KiB
C
Executable File
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
#include "chip_reg_base.h"
|
|
#include "hw_reg_api.h"
|
|
#include "hw_tonemask.h"
|
|
#include "plc_utils.h"
|
|
#include "mac_reset.h"
|
|
#include "mac_hwq_reg.h"
|
|
#include "mac_sys_reg.h"
|
|
#include "mac_rx_reg.h"
|
|
#include "mac_tmr_reg.h"
|
|
#include "ada_reg.h"
|
|
#include "hw_phy_init.h"
|
|
#include "phy_ana.h"
|
|
#include "phy_reg.h"
|
|
#include "mpdu_frame.h"
|
|
#include "ahb_rf.h"
|
|
#include "mac_tx_main.h"
|
|
#include "intc_reg.h"
|
|
#include "apb_glb_reg.h"
|
|
#include "command_list.h"
|
|
#include "dbg_io.h"
|
|
#include "iot_config.h"
|
|
#include "iot_io.h"
|
|
#include "phy_rx_fd_reg.h"
|
|
#include "phy_txrx_pwr.h"
|
|
#include "plc_protocol.h"
|
|
#include "clk.h"
|
|
#include "iot_wdg.h"
|
|
#include "hal_rx.h"
|
|
#include "tx_entry.h"
|
|
#include "hw_phy_api.h"
|
|
#include "hw_tx.h"
|
|
#include "phy_mix.h"
|
|
#include "phy_chn.h"
|
|
|
|
#if TARGET_VERSION == 2
|
|
#include "phy_tmap.h"
|
|
#endif
|
|
|
|
uint32_t mac_tx_single_mode()
|
|
{
|
|
volatile uint32_t tx_done = 0;
|
|
uint32_t enq_time = 0, cur_time = 0;
|
|
int64_t time_span = 0;
|
|
uint32_t start_time = 0, end_time = 0;
|
|
iot_phy_sts_info_t total_sts = {0};
|
|
uint32_t rate_idx = 0;
|
|
uint32_t band_idx = 0;
|
|
|
|
#if PHY_TX_ALWAYS_EN == 1
|
|
phy_ctrl_tx_always_en(true);
|
|
#endif
|
|
|
|
start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for cnt*/
|
|
/* beacon or sof transmit */
|
|
do {
|
|
enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for tx*/
|
|
/* send the beacon */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
/* hwq config */
|
|
dt_mac_hwq0_ptr_set((uint32_t)mpdu_start);
|
|
/* multi hwq */
|
|
if (glb_cfg.hwq_num > 1) {
|
|
dt_mac_hwq1_ptr_set((uint32_t)mpdu_start);
|
|
}
|
|
dt_mac_tx_hwq0_re_trig();
|
|
do { // wait for tx done and hwq disable
|
|
cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = cur_time - enq_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - enq_time + cur_time;
|
|
}
|
|
tx_done = phy_get_tx_done_from_mpdu(mpdu_start);
|
|
} while (!tx_done \
|
|
|| ((uint64_t)time_span < bcn_period_ms * TICKS_MS));
|
|
|
|
/* tx cnt print */
|
|
end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = end_time - start_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - start_time + end_time;
|
|
}
|
|
if((uint64_t)time_span > print_tx_period_ms*TICKS_MS){
|
|
phy_sts_get(&total_sts);
|
|
iot_printf("mac tx ok:%d/4s, fc_ok:%d/4s, fc_err:%d/4s,", \
|
|
total_sts.mac_tx_ok_cnt, total_sts.fc_crc_ok_cnt, \
|
|
total_sts.fc_crc_fail_cnt);
|
|
iot_printf("pld_ok:%d/4s, pld fail:%d/4s, sync ok:%d/4s\r\n", \
|
|
total_sts.pld_crc_ok_cnt, total_sts.pld_crc_fail_cnt, \
|
|
total_sts.sync_ok_cnt);
|
|
start_time = end_time;
|
|
#if MAC_TX_TEST_ID == MAC_TX_BURN
|
|
mpdu_start->resv++;
|
|
wdg_feed_dog(1);
|
|
iot_printf("4s cnt %u, feed dog!\r\n",mpdu_start->resv);
|
|
#endif
|
|
/* band info */
|
|
for(rate_idx=0; rate_idx<MAC_BB_MAX_RATE; rate_idx++)
|
|
{
|
|
for(band_idx=0; band_idx<MAX_HW_BAND; band_idx++)
|
|
{
|
|
if(band_cnt[rate_idx][band_idx] != 0){
|
|
iot_printf("[RATE-%d][BAND-%d]:%d\r\n", \
|
|
rate_idx, band_idx, band_cnt[rate_idx][band_idx]);
|
|
band_cnt[rate_idx][band_idx] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} while (true);
|
|
|
|
return 0;
|
|
}
|
|
|
|
extern tonemap_table_entry spg_tonemap_table[];
|
|
extern tonemap_table_entry spg_ext_tonemap_table[];
|
|
extern tonemap_table_entry sg_tonemap_table[];
|
|
extern tonemap_table_entry sg_ext_tonemap_table[];
|
|
extern tonemap_table_entry gp_tonemap_table[];
|
|
uint32_t mac_tx_tmi_scan()
|
|
{
|
|
uint32_t tx_done = 0;
|
|
uint32_t enq_time = 0, cur_time = 0;
|
|
int64_t time_span = 0;
|
|
iot_phy_sts_info_t total_sts = {0};
|
|
uint32_t tmi_retry_cnt = 0;
|
|
|
|
/* pb num for each tmi */
|
|
for(uint32_t j=1; j<5; j++)
|
|
{
|
|
for(uint32_t i=0; i<MAC_EXT_TMI_MAX; i++)
|
|
{
|
|
#if (SUPPORT_SMART_GRID)
|
|
if(PHY_PROTO_TYPE_GET() == PLC_PROTO_TYPE_SG) {
|
|
if(i < 15) {
|
|
/* mask unused TMI in standard table */
|
|
if(sg_tonemap_table[i].pb_size == 0 || \
|
|
j > sg_tonemap_table[i].max_pb_num) {
|
|
continue;
|
|
}
|
|
} else {
|
|
/* mask unused TMI in ext table */
|
|
if(sg_ext_tonemap_table[i-15].pb_size == 0 || \
|
|
j > sg_ext_tonemap_table[i-15].max_pb_num) {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
#if IOT_PLC_PHY_BAND_DFT == IOT_SUPPORT_TONE_100_230
|
|
/* total symb num >= 512*/
|
|
if((i == 7 && j >= 2) || (i == 8 && j >= 2) || \
|
|
(i == 3 && j >= 3) || (i == 9 && j >= 3) || \
|
|
(i == 12 && j >= 3) || (i == 0 && j == 4) || \
|
|
(i == 10 && j == 4))
|
|
continue;
|
|
#endif
|
|
} else
|
|
#endif
|
|
#if (SUPPORT_SOUTHERN_POWER_GRID)
|
|
if (PHY_PROTO_TYPE_GET() == PLC_PROTO_TYPE_SPG) {
|
|
if (i < 15) {
|
|
/* mask some unused TMI */
|
|
if (spg_tonemap_table[i].pb_size == 0 || \
|
|
j > spg_tonemap_table[i].max_pb_num) {
|
|
continue;
|
|
}
|
|
} else {
|
|
/* mask unused TMI in ext table */
|
|
if (spg_ext_tonemap_table[i-15].pb_size == 0 || \
|
|
j > spg_ext_tonemap_table[i-15].max_pb_num) {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#if (SUPPORT_GREEN_PHY)
|
|
if(PHY_PROTO_TYPE_GET() == PLC_PROTO_TYPE_GP) {
|
|
/* mask some unused TMI */
|
|
if(gp_tonemap_table[i].pb_size == 0 || \
|
|
j > gp_tonemap_table[i].max_pb_num)
|
|
continue;
|
|
/* max tmi */
|
|
if(i >= GP_TMI_MAX)
|
|
continue;
|
|
}
|
|
#endif
|
|
{/* MACRO format */}
|
|
|
|
glb_cfg.tmi = i;
|
|
glb_cfg.pb_num = j;
|
|
tmi_retry_cnt = MAC_TMI_SCAN_CNT;
|
|
while(tmi_retry_cnt--)
|
|
{
|
|
enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for tx*/
|
|
/* send the beacon */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
do { // wait for tx done and hwq disable
|
|
cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = cur_time - enq_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - enq_time + cur_time;
|
|
}
|
|
tx_done = phy_get_tx_done_from_mpdu(mpdu_start);
|
|
} while (!tx_done \
|
|
|| ((uint64_t)time_span < bcn_period_ms * TICKS_MS));
|
|
}
|
|
|
|
phy_sts_get(&total_sts);
|
|
iot_printf("[TMI-%d][PB-%d]:\r\nmac tx ok:%d/4s,"
|
|
" fc_ok:%d/4s, fc_err:%d/4s,", \
|
|
glb_cfg.tmi, glb_cfg.pb_num, total_sts.mac_tx_ok_cnt, \
|
|
total_sts.fc_crc_ok_cnt, total_sts.fc_crc_fail_cnt);
|
|
iot_printf("pld_ok:%d/4s, pld fail:%d/4s, sync ok:%d/4s\r\n", \
|
|
total_sts.pld_crc_ok_cnt, total_sts.pld_crc_fail_cnt, \
|
|
total_sts.sync_ok_cnt);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t mac_tx_bcn_alert()
|
|
{
|
|
uint32_t tmp1 = 0;
|
|
|
|
/* beacon alert */
|
|
do {
|
|
/* beacon period */
|
|
RGF_MAC_WRITE_REG(CFG_BEACON_PERIOD_ADDR, 0xffff0000);//1000ms
|
|
|
|
/* beacon alert ahead */
|
|
RGF_MAC_WRITE_REG(CFG_BEACON_ADDR,1);
|
|
|
|
/* scedule */
|
|
tmp1 = RGF_HWQ_READ_REG(CFG_SCHEDULE_ADDR);
|
|
REG_FIELD_SET(CFG_SCH_EN,tmp1,1);
|
|
REG_FIELD_SET(CFG_SCH_CMD_NUM,tmp1,0);
|
|
REG_FIELD_SET(CFG_SCH_WR_TRIG,tmp1,1);
|
|
REG_FIELD_SET(CFG_SCH_SELF_RECUR_EN,tmp1,1);
|
|
REG_FIELD_SET(SCH_WR_TRIG_ENABLE,tmp1,0);
|
|
REG_FIELD_SET(SCH_CUR_NUM,tmp1,0);
|
|
RGF_HWQ_WRITE_REG(CFG_SCHEDULE_ADDR,tmp1);
|
|
|
|
while(!mac_beacon_alert_flag);
|
|
mac_beacon_alert_flag = false;
|
|
|
|
} while (true);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t mac_tx_complete()
|
|
{
|
|
int64_t time_span = 0;
|
|
uint32_t start_time = 0, end_time = 0;
|
|
iot_phy_sts_info_t total_sts = {0};
|
|
uint32_t start1_time = 0, end1_time = 0;
|
|
uint32_t rate_idx = 0;
|
|
uint32_t band_idx = 0;
|
|
|
|
/* tx complete */
|
|
start1_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for print*/
|
|
do {
|
|
/* send the beacon/sof */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
|
|
while(!mac_tx_complete_flag);
|
|
mac_tx_complete_flag = false;
|
|
|
|
start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for tx*/
|
|
do { // wait for tx done and hwq disable
|
|
end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = end_time - start_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - start_time + end_time;
|
|
}
|
|
} while ((uint64_t)time_span < (bcn_period_ms-5) * TICKS_MS);
|
|
|
|
/* tx cnt print */
|
|
end1_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = end1_time - start1_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - start1_time + end1_time;
|
|
}
|
|
if((uint64_t)time_span > print_tx_period_ms*TICKS_MS){
|
|
phy_sts_get(&total_sts);
|
|
iot_printf("mac tx ok:%d/4s, fc_ok:%d/4s, fc_err:%d/4s,", \
|
|
total_sts.mac_tx_ok_cnt, total_sts.fc_crc_ok_cnt, \
|
|
total_sts.fc_crc_fail_cnt);
|
|
iot_printf("pld_ok:%d/4s, pld fail:%d/4s, sync ok:%d/4s\r\n", \
|
|
total_sts.pld_crc_ok_cnt, total_sts.pld_crc_fail_cnt, \
|
|
total_sts.sync_ok_cnt);
|
|
start1_time = end1_time;
|
|
|
|
/* band info */
|
|
for(rate_idx=0; rate_idx<MAC_BB_MAX_RATE; rate_idx++)
|
|
{
|
|
for(band_idx=0; band_idx<MAX_HW_BAND; band_idx++)
|
|
{
|
|
if(band_cnt[rate_idx][band_idx] != 0){
|
|
iot_printf("[RATE-%d][BAND-%d]:%d\r\n", \
|
|
rate_idx, band_idx, band_cnt[rate_idx][band_idx]);
|
|
band_cnt[rate_idx][band_idx] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} while (true);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t mac_tx_sched()
|
|
{
|
|
uint32_t tmp1 = 0;
|
|
uint32_t cur_time;
|
|
hw_sched_cmd_t cmd[HW_SCHED_CMD_MAX_CNT];
|
|
|
|
/* schedule: beacon ahead alert interrupt */
|
|
do {
|
|
/* send the beacon */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
|
|
/* q0 ptr */
|
|
RGF_HWQ_WRITE_REG(CFG_Q0_PTR_ADDR,(uint32_t)(mpdu_start));
|
|
|
|
/* q0 ena */
|
|
RGF_HWQ_WRITE_REG(CFG_Q_ENA_ADDR,0x1);
|
|
|
|
#if MAC_DTEST_PLATFORM == MAC_DTEST_EDA
|
|
/* beacon period */
|
|
RGF_MAC_WRITE_REG(CFG_BEACON_PERIOD_ADDR, 0x320000);//50ms
|
|
|
|
/* beacon alert ahead */
|
|
RGF_MAC_WRITE_REG(CFG_BEACON_ADDR,5);//5ms
|
|
#define END_TIME_UNIT 10
|
|
#elif MAC_DTEST_PLATFORM == MAC_DTEST_FPGA
|
|
/* beacon period */
|
|
RGF_MAC_WRITE_REG(CFG_BEACON_PERIOD_ADDR, 0x3E80000);//1s
|
|
|
|
/* beacon alert ahead */
|
|
RGF_MAC_WRITE_REG(CFG_BEACON_ADDR,100);//100ms
|
|
#define END_TIME_UNIT 10
|
|
#endif
|
|
|
|
cmd[0].t_info.se.end_t=END_TIME_UNIT;//1ms
|
|
cmd[0].t_info.se.start_t=0x0;
|
|
cmd[0].t_info.se.r_flag=0x0;
|
|
cmd[0].t_info.se.s_flag=0x0;
|
|
cmd[0].phase=0x1;
|
|
cmd[0].nb_flag=0x0;
|
|
cmd[0].idle_bit=0x0;
|
|
cmd[0].req_int=0x0;
|
|
cmd[0].rx_rate_mode=RX_MODE_SR;
|
|
cmd[0].tx_q_en_bm=0x1;
|
|
|
|
for(uint32_t i=1;i<HW_SCHED_CMD_MAX_CNT;i++)
|
|
{
|
|
cmd[i]=cmd[i-1];
|
|
cmd[i].t_info.se.end_t=(i+1)*END_TIME_UNIT;
|
|
}
|
|
/* sch ptr */
|
|
RGF_HWQ_WRITE_REG(CFG_SCH_PTR_ADDR,(uint32_t)cmd);
|
|
|
|
cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR); //25M 0.04us
|
|
RGF_MAC_WRITE_REG(CFG_BCN_START_NTB_ADDR,cur_time+0x500);
|
|
|
|
/* scedule */
|
|
tmp1 = RGF_HWQ_READ_REG(CFG_SCHEDULE_ADDR);
|
|
REG_FIELD_SET(CFG_SCH_EN,tmp1,1);
|
|
REG_FIELD_SET(CFG_SCH_CMD_NUM,tmp1,100);
|
|
REG_FIELD_SET(CFG_SCH_WR_TRIG,tmp1,1);
|
|
REG_FIELD_SET(CFG_SCH_SELF_RECUR_EN,tmp1,1);
|
|
REG_FIELD_SET(SCH_WR_TRIG_ENABLE,tmp1,0);
|
|
REG_FIELD_SET(SCH_CUR_NUM,tmp1,0);
|
|
RGF_HWQ_WRITE_REG(CFG_SCHEDULE_ADDR,tmp1);
|
|
|
|
while(!mac_beacon_alert_flag);
|
|
mac_beacon_alert_flag = false;
|
|
}while(true);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void mac_tx_mix()
|
|
{
|
|
uint32_t tmp = 0;
|
|
|
|
/* mix en from mac in the future */
|
|
tmp = RGF_MAC_READ_REG(CFG_PHY_CTRL_ADDR);
|
|
REG_FIELD_SET(CFG_PHY_TX_LONG_PREAM_EN, tmp, 1);
|
|
RGF_MAC_WRITE_REG(CFG_PHY_CTRL_ADDR,tmp);
|
|
|
|
/* normal tx */
|
|
mac_tx_single_mode();
|
|
}
|
|
|
|
void mac_tx_gp_ext()
|
|
{
|
|
uint32_t tmp = 0;
|
|
uint32_t tx_done = 0;
|
|
uint32_t enq_time = 0, cur_time = 0;
|
|
int64_t time_span = 0;
|
|
iot_phy_sts_info_t total_sts = {0};
|
|
uint32_t tmi_retry_cnt = 0;
|
|
|
|
/* mix en */
|
|
phy_mix_flag_set(true);
|
|
|
|
/* mix en from mac in the future */
|
|
tmp = RGF_MAC_READ_REG(CFG_GP_CTRL_ADDR);
|
|
REG_FIELD_SET(CFG_GP_PB_SIZE_SEL, tmp, 1);
|
|
RGF_MAC_WRITE_REG(CFG_GP_CTRL_ADDR,tmp);
|
|
|
|
tmp = PHY_RX_FD_READ_REG(CFG_BB_SEND_MAC_CTRL_ADDR);
|
|
REG_FIELD_SET(SW_ALWAYS_SEND_FC, tmp, 0);
|
|
PHY_RX_FD_WRITE_REG(CFG_BB_SEND_MAC_CTRL_ADDR, tmp);
|
|
|
|
#if MAC_TMI_ID == MAC_TMI_4 || MAC_TMI_ID == 5
|
|
/* fix symbnum */
|
|
tmp = RGF_TMR_READ_REG(CFG_TX_FC_CTRL_ADDR);
|
|
REG_FIELD_SET(CFG_TX_FC_FL_BY_SW, tmp , 1);
|
|
RGF_TMR_WRITE_REG(CFG_TX_FC_CTRL_ADDR, tmp);
|
|
#endif
|
|
|
|
#if IOT_PLC_PHY_BAND_DFT == IOT_SUPPORT_TONE_80_1228
|
|
phy_rxfd_rate0_det(80,1228);
|
|
phy_rxfd_rate1_det(80,1228);
|
|
#endif
|
|
|
|
/* normal tx for single mode */
|
|
//mac_tx_single_mode();
|
|
|
|
/* pb num for each tmi */
|
|
for(uint32_t j=1; j<5; j++)
|
|
{
|
|
for(uint32_t i=4; i<MAC_EXT_TMI_2; i++)
|
|
{
|
|
if(i == 4 || i == 5)
|
|
{
|
|
/* fix symbnum */
|
|
tmp = RGF_TMR_READ_REG(CFG_TX_FC_CTRL_ADDR);
|
|
REG_FIELD_SET(CFG_TX_FC_FL_BY_SW, tmp , 1);
|
|
RGF_TMR_WRITE_REG(CFG_TX_FC_CTRL_ADDR, tmp);
|
|
}
|
|
else{
|
|
/* fix symbnum */
|
|
tmp = RGF_TMR_READ_REG(CFG_TX_FC_CTRL_ADDR);
|
|
REG_FIELD_SET(CFG_TX_FC_FL_BY_SW, tmp , 0);
|
|
RGF_TMR_WRITE_REG(CFG_TX_FC_CTRL_ADDR, tmp);
|
|
}
|
|
|
|
glb_cfg.tmi = i;
|
|
glb_cfg.pb_num = j;
|
|
tmi_retry_cnt = MAC_TMI_SCAN_CNT;
|
|
while(tmi_retry_cnt--)
|
|
{
|
|
enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for tx*/
|
|
/* send the beacon */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
do { // wait for tx done and hwq disable
|
|
cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = cur_time - enq_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - enq_time + cur_time;
|
|
}
|
|
tx_done = phy_get_tx_done_from_mpdu(mpdu_start);
|
|
} while (!tx_done \
|
|
|| ((uint64_t)time_span < bcn_period_ms * TICKS_MS));
|
|
}
|
|
|
|
phy_sts_get(&total_sts);
|
|
iot_printf("[TMI-%d][PB-%d]:\r\n"
|
|
"mac tx ok:%d/4s, fc_ok:%d/4s, fc_err:%d/4s,", \
|
|
glb_cfg.tmi, glb_cfg.pb_num, total_sts.mac_tx_ok_cnt, \
|
|
total_sts.fc_crc_ok_cnt, total_sts.fc_crc_fail_cnt);
|
|
iot_printf("pld_ok:%d/4s, pld fail:%d/4s, sync ok:%d/4s\r\n", \
|
|
total_sts.pld_crc_ok_cnt, total_sts.pld_crc_fail_cnt,
|
|
total_sts.sync_ok_cnt);
|
|
}
|
|
}
|
|
}
|
|
|
|
void mac_tx_gp_tone_mask()
|
|
{
|
|
/* check protocol */
|
|
IOT_ASSERT(glb_cfg.m_type == PLC_PROTO_TYPE_GP);
|
|
|
|
const plc_tonemask_table *tonemask_tbl_ptr = \
|
|
&all_mask_tone_mask_table_gp;
|
|
|
|
/* full band */
|
|
init_band_table(&all_mask_band_table_r0_full, \
|
|
HW_FULL_BAND, \
|
|
tonemask_tbl_ptr, \
|
|
all_mask_band_table_r0_full.fc_sym_num, \
|
|
all_mask_band_table_r0_full.start_tone, \
|
|
all_mask_band_table_r0_full.end_tone);
|
|
/* low band */
|
|
init_band_table(&all_mask_band_table_r0_low, \
|
|
HW_LOW_BAND, \
|
|
tonemask_tbl_ptr, \
|
|
all_mask_band_table_r0_low.fc_sym_num, \
|
|
all_mask_band_table_r0_low.start_tone, \
|
|
all_mask_band_table_r0_low.end_tone);
|
|
/* high band */
|
|
init_band_table(&all_mask_band_table_r0_high, \
|
|
HW_HIGH_BAND, \
|
|
tonemask_tbl_ptr, \
|
|
all_mask_band_table_r0_high.fc_sym_num, \
|
|
all_mask_band_table_r0_high.start_tone, \
|
|
all_mask_band_table_r0_high.end_tone);
|
|
|
|
/* full band */
|
|
init_band_table(&all_mask_band_table_r1_full, \
|
|
HW_FULL_BAND, \
|
|
tonemask_tbl_ptr, \
|
|
all_mask_band_table_r1_full.fc_sym_num, \
|
|
all_mask_band_table_r1_full.start_tone, \
|
|
all_mask_band_table_r1_full.end_tone);
|
|
/* low band */
|
|
init_band_table(&all_mask_band_table_r1_low, \
|
|
HW_LOW_BAND, \
|
|
tonemask_tbl_ptr, \
|
|
all_mask_band_table_r1_low.fc_sym_num, \
|
|
all_mask_band_table_r1_low.start_tone, \
|
|
all_mask_band_table_r1_low.end_tone);
|
|
/* high band */
|
|
init_band_table(&all_mask_band_table_r1_high, \
|
|
HW_HIGH_BAND, \
|
|
tonemask_tbl_ptr, \
|
|
all_mask_band_table_r1_high.fc_sym_num, \
|
|
all_mask_band_table_r1_high.start_tone, \
|
|
all_mask_band_table_r1_high.end_tone);
|
|
|
|
/* cal new tone para */
|
|
phy_band_init(PLC_PROTO_TYPE_GP, IOT_SUPPORT_TONE_80_1228);
|
|
/* load new mask */
|
|
phy_tone_mask_amp_phase_tab_load(&all_mask_amp_phase_table, \
|
|
TONE_MASK_ID_GP, \
|
|
PLC_PROTO_TYPE_GP);
|
|
|
|
/* add amplitude mask to optimze mask snr */
|
|
phy_amp_mask_set(214, 214);
|
|
phy_amp_mask_set(226, 226);
|
|
phy_amp_mask_set(749, 749);
|
|
phy_amp_mask_set(735, 736);
|
|
phy_amp_mask_set(420, 421);
|
|
|
|
/* normal tx */
|
|
mac_tx_single_mode();
|
|
}
|
|
|
|
void mac_tx_band_switch()
|
|
{
|
|
/* init */
|
|
phy_reinit( \
|
|
PLC_PROTO_TYPE_SG, \
|
|
IOT_SUPPORT_TONE_80_490, \
|
|
TONE_MASK_ID_NULL, \
|
|
true);
|
|
|
|
/* delay */
|
|
for(uint32_t i = 0; i < 300; i++)
|
|
{
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
for(uint32_t j = 0; j < 50000; j++);
|
|
}
|
|
|
|
/* init */
|
|
phy_reinit( \
|
|
PLC_PROTO_TYPE_SG, \
|
|
IOT_SUPPORT_TONE_100_230, \
|
|
TONE_MASK_ID_NULL, \
|
|
true);
|
|
|
|
/* normal tx */
|
|
mac_tx_single_mode();
|
|
}
|
|
|
|
void phy_tx_td_start_test()
|
|
{
|
|
uint8_t tmi = 0;
|
|
uint32_t rate_idx = 0;
|
|
uint32_t band_idx = 0;
|
|
int64_t time_span = 0;
|
|
uint32_t enq_time = 0, cur_time = 0;
|
|
uint32_t start_time = 0, end_time = 0;
|
|
iot_phy_sts_info_t total_sts = {0};
|
|
volatile uint32_t tx_done = 0;
|
|
|
|
/* init phy interrupt */
|
|
#if TARGET_VERSION < 2
|
|
phy_interrupt_init();
|
|
#endif
|
|
|
|
/* tx start */
|
|
start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for cnt*/
|
|
/* beacon or sof transmit */
|
|
do {
|
|
glb_cfg.tmi = tmi;
|
|
enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for tx*/
|
|
/* send the beacon */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
do { // wait for tx done and hwq disable
|
|
cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = cur_time - enq_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - enq_time + cur_time;
|
|
}
|
|
tx_done = phy_get_tx_done_from_mpdu(mpdu_start);
|
|
} while (!tx_done \
|
|
|| ((uint64_t)time_span < bcn_period_ms * TICKS_MS));
|
|
|
|
/* update tmi */
|
|
tmi = (tmi > 1) ? 0 : (tmi + 1);
|
|
|
|
/* tx cnt print */
|
|
end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = end_time - start_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - start_time + end_time;
|
|
}
|
|
if((uint64_t)time_span > print_tx_period_ms*TICKS_MS){
|
|
/* print sts */
|
|
phy_sts_get(&total_sts);
|
|
iot_printf("[TMI-%d]:\n", glb_cfg.tmi);
|
|
iot_printf("mac tx ok:%d/4s, fc_ok:%d/4s, fc_err:%d/4s,", \
|
|
total_sts.mac_tx_ok_cnt, total_sts.fc_crc_ok_cnt, \
|
|
total_sts.fc_crc_fail_cnt);
|
|
iot_printf("pld_ok:%d/4s, pld fail:%d/4s, sync ok:%d/4s\r\n", \
|
|
total_sts.pld_crc_ok_cnt, total_sts.pld_crc_fail_cnt, \
|
|
total_sts.sync_ok_cnt);
|
|
start_time = end_time;
|
|
/* band info */
|
|
for(rate_idx=0; rate_idx<MAC_BB_MAX_RATE; rate_idx++)
|
|
{
|
|
for(band_idx=0; band_idx<MAX_HW_BAND; band_idx++)
|
|
{
|
|
if(band_cnt[rate_idx][band_idx] != 0){
|
|
iot_printf("[RATE-%d][BAND-%d]:%d\r\n", \
|
|
rate_idx, band_idx, band_cnt[rate_idx][band_idx]);
|
|
band_cnt[rate_idx][band_idx] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} while (true);
|
|
}
|
|
|
|
/*
|
|
* 1 high power bcn and 9 -20dB low power bcn with tmi 3. pkt time span 4-10s.
|
|
* transmit tmi7 pb520 have the same tx power with the same bcn. gree low band.
|
|
*/
|
|
void phy_tx_emc_scan()
|
|
{
|
|
volatile uint32_t tx_done = 0;
|
|
/* bcn time start and end time */
|
|
uint32_t last_time = 0, cur_time = 0;
|
|
int64_t time_span = 0;
|
|
/* broadcast sof start and end time */
|
|
uint32_t start_time = 0, end_time = 0;
|
|
/* broadcast delay */
|
|
uint32_t dly_start_time = 0, dly_end_time = 0;
|
|
/* bcn time span: ms */
|
|
uint16_t bcn_time_period = 2000;
|
|
/* sof time span: ms */
|
|
uint16_t sof_time_period = 1000;
|
|
/* sts print */
|
|
iot_phy_sts_info_t total_sts = {0};
|
|
uint32_t rate_idx = 0;
|
|
uint32_t band_idx = 0;
|
|
/* bcn index */
|
|
uint8_t bcn_index = 0;
|
|
|
|
start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for cnt*/
|
|
last_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for tx*/
|
|
dly_start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
/* beacon or sof transmit */
|
|
do {
|
|
cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = cur_time - last_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - last_time + cur_time;
|
|
}
|
|
if((uint64_t)time_span > bcn_time_period*TICKS_MS){
|
|
if(bcn_index < 9) {
|
|
/* -20dB power */
|
|
if(!bcn_index) {
|
|
phy_pwr_adjust_set(127);
|
|
}
|
|
bcn_index++;
|
|
} else {
|
|
bcn_index = 0;
|
|
/* full power */
|
|
phy_pwr_adjust_set(137);
|
|
}
|
|
glb_cfg.tmi = 3;
|
|
glb_cfg.p_type = FC_DELIM_BEACON;
|
|
/* send the beacon */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
do { // wait for tx done and hwq disable
|
|
tx_done = phy_get_tx_done_from_mpdu(mpdu_start);
|
|
} while (!tx_done);
|
|
last_time = cur_time;
|
|
}
|
|
|
|
/* sof time span */
|
|
end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = end_time - start_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - start_time + end_time;
|
|
}
|
|
if((uint64_t)time_span > sof_time_period*TICKS_MS){
|
|
/* update config */
|
|
glb_cfg.tmi = 7;
|
|
glb_cfg.p_type = FC_DELIM_SOF;
|
|
glb_cfg.ack_en = 0;
|
|
/* send the sof */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
do { // wait for tx done and hwq disable
|
|
tx_done = phy_get_tx_done_from_mpdu(mpdu_start);
|
|
} while (!tx_done);
|
|
start_time = end_time;
|
|
}
|
|
|
|
dly_end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = dly_end_time - dly_start_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - dly_start_time + dly_end_time;
|
|
}
|
|
if((uint64_t)time_span > 4000*TICKS_MS){
|
|
/* print tx cnt */
|
|
phy_sts_get(&total_sts);
|
|
iot_printf("mac tx ok:%d/4s, fc_ok:%d/4s, fc_err:%d/4s,", \
|
|
total_sts.mac_tx_ok_cnt, total_sts.fc_crc_ok_cnt, \
|
|
total_sts.fc_crc_fail_cnt);
|
|
iot_printf("pld_ok:%d/4s, pld fail:%d/4s, sync ok:%d/4s\r\n", \
|
|
total_sts.pld_crc_ok_cnt, total_sts.pld_crc_fail_cnt, \
|
|
total_sts.sync_ok_cnt);
|
|
/* band info */
|
|
for(rate_idx=0; rate_idx<MAC_BB_MAX_RATE; rate_idx++)
|
|
{
|
|
for(band_idx=0; band_idx<MAX_HW_BAND; band_idx++)
|
|
{
|
|
if(band_cnt[rate_idx][band_idx] != 0){
|
|
iot_printf("[RATE-%d][BAND-%d]:%d\r\n", \
|
|
rate_idx, band_idx, band_cnt[rate_idx][band_idx]);
|
|
band_cnt[rate_idx][band_idx] = 0;
|
|
}
|
|
}
|
|
}
|
|
dly_start_time = dly_end_time;
|
|
}
|
|
} while (true);
|
|
}
|
|
|
|
void mac_phy_rst_flow()
|
|
{
|
|
int64_t time_span = 0;
|
|
uint32_t enq_time = 0, cur_time = 0;
|
|
uint32_t start_time = 0, end_time = 0;
|
|
uint32_t rate_idx = 0, band_idx = 0;
|
|
iot_phy_sts_info_t total_sts = {0};
|
|
volatile uint32_t tx_done = 0;
|
|
|
|
/* tx start */
|
|
start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for cnt*/
|
|
/* beacon or sof transmit */
|
|
do {
|
|
enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for tx*/
|
|
/* send the beacon */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
do { // wait for tx done and hwq disable
|
|
cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = cur_time - enq_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - enq_time + cur_time;
|
|
}
|
|
tx_done = phy_get_tx_done_from_mpdu(mpdu_start);
|
|
} while (!tx_done \
|
|
|| ((uint64_t)time_span < bcn_period_ms * TICKS_MS));
|
|
|
|
/* tx cnt print */
|
|
end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
time_span = end_time - start_time;
|
|
if (time_span < 0) { // wrap around
|
|
time_span = (0x100000000LL) - start_time + end_time;
|
|
}
|
|
if((uint64_t)time_span > print_tx_period_ms*TICKS_MS) {
|
|
/* update band id */
|
|
glb_cfg.band_id = !glb_cfg.band_id;
|
|
/* pre reinit */
|
|
mac_set_sw_idle_mode(1, 1);
|
|
mac_wait_phy_txrx_idle();
|
|
mac_force_phy_tx_ready(1, 1);
|
|
/* wait hwq to be idle */
|
|
mac_tx_wait_all_queue_idle(true, 30);
|
|
/* mac rst hold */
|
|
//warm_rst_mac_hold();
|
|
/* phy reinit */
|
|
phy_reinit(PLC_PROTO_TYPE_SG, glb_cfg.band_id, TONE_MASK_ID_NULL, true);
|
|
/* mac rst release */
|
|
//warm_rst_mac_release();
|
|
/* release idle mode */
|
|
mac_force_phy_tx_ready(0, 0);
|
|
/* must del ena after del force */
|
|
mac_set_sw_idle_mode(1,0);
|
|
mac_set_sw_idle_mode(0,0);
|
|
|
|
/* print sts */
|
|
phy_sts_get(&total_sts);
|
|
iot_printf("[TMI-%d]:\n", glb_cfg.tmi);
|
|
iot_printf("mac tx ok:%d/4s, fc_ok:%d/4s, fc_err:%d/4s,", \
|
|
total_sts.mac_tx_ok_cnt, total_sts.fc_crc_ok_cnt, \
|
|
total_sts.fc_crc_fail_cnt);
|
|
iot_printf("pld_ok:%d/4s, pld fail:%d/4s, sync ok:%d/4s\r\n", \
|
|
total_sts.pld_crc_ok_cnt, total_sts.pld_crc_fail_cnt, \
|
|
total_sts.sync_ok_cnt);
|
|
start_time = end_time;
|
|
/* band info */
|
|
for(rate_idx=0; rate_idx<MAC_BB_MAX_RATE; rate_idx++)
|
|
{
|
|
for(band_idx=0; band_idx<MAX_HW_BAND; band_idx++)
|
|
{
|
|
if(band_cnt[rate_idx][band_idx] != 0){
|
|
iot_printf("[RATE-%d][BAND-%d]:%d\r\n", \
|
|
rate_idx, band_idx, band_cnt[rate_idx][band_idx]);
|
|
band_cnt[rate_idx][band_idx] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} while (true);
|
|
}
|
|
|
|
void mac_tmap_test()
|
|
{
|
|
#if SUPPORT_GREEN_PHY
|
|
/* check protocol */
|
|
IOT_ASSERT(glb_cfg.m_type == PLC_PROTO_TYPE_GP);
|
|
|
|
/* update ext tmi */
|
|
glb_cfg.tmi = MAC_TMI_7;
|
|
|
|
/* tmap common config must behind burst */
|
|
phy_tmap_common_init();
|
|
/* self tmi */
|
|
phy_tmap_self_tmi_set(1);
|
|
/* mac tmap init */
|
|
mac_tmap_init();
|
|
|
|
mac_tx_single_mode();
|
|
#endif
|
|
}
|
|
|
|
void phy_gp_hybrid_mode_test()
|
|
{
|
|
#if SUPPORT_GREEN_PHY
|
|
/* check protocol */
|
|
IOT_ASSERT(glb_cfg.m_type == PLC_PROTO_TYPE_GP);
|
|
|
|
/* update standard tmi */
|
|
glb_cfg.tmi = MAC_TMI_2;
|
|
|
|
/* init gp hybrid mode */
|
|
phy_gp_hybrid_mode_init();
|
|
/* update ppdu mode */
|
|
glb_cfg.ppdu_mode = HW_DESC_PPDU_MODE_HYBRID_1FCSYM;
|
|
|
|
mac_tx_single_mode();
|
|
#endif
|
|
}
|
|
|
|
void phy_gp_burst_mode_test()
|
|
{
|
|
#if SUPPORT_GREEN_PHY
|
|
/* check protocol */
|
|
IOT_ASSERT(glb_cfg.m_type == PLC_PROTO_TYPE_GP);
|
|
|
|
/* update standard tmi */
|
|
glb_cfg.tmi = MAC_TMI_2;
|
|
|
|
/* init gp burst mode */
|
|
phy_gp_burst_init();
|
|
/* update mpdu number */
|
|
glb_cfg.mpdu_cnt = 2;
|
|
/* 20us +/- 0.5 us */
|
|
dtest_mac_bifs_set(5);
|
|
|
|
mac_tx_single_mode();
|
|
#endif
|
|
}
|
|
|
|
void mac_tx_start()
|
|
{
|
|
platform_tx_pre_init();
|
|
|
|
#if HW_PLATFORM > HW_PLATFORM_SIMU
|
|
#if EDA_SIMU_SUPPORT != 1
|
|
iot_print_config(true);
|
|
|
|
/* serial init */
|
|
dbg_uart_init();
|
|
iot_printf("mac_tx_test begin...\n");
|
|
#endif
|
|
#endif
|
|
|
|
/* mac tx common init interface */
|
|
tx_common_init(IOT_PLC_PHY_BAND_DFT);
|
|
|
|
/* mac rx common init interface */
|
|
rx_common_init(IOT_PLC_PHY_BAND_DFT);
|
|
|
|
#if defined(MODULE_EN)
|
|
if(glb_cfg.t_type == MAC_TX_SCHED_BCN_AHEAD_ALERT)
|
|
iot_printf("[Error]: Must debug mode...\n");
|
|
/* send the beacon/sof */
|
|
mac_tx_mpdu_test(NULL, mpdu_start);
|
|
dt_mac_tx_hwq0_re_trig();
|
|
|
|
while(!mac_tx_complete_flag);
|
|
mac_tx_complete_flag = false;
|
|
|
|
return;
|
|
#endif
|
|
|
|
#if 0
|
|
/* disable intr */
|
|
PHY_WRITE_REG(CFG_BB_INT_EN_0_ADDR, 0);
|
|
PHY_WRITE_REG(CFG_BB_INT_EN_1_ADDR, 0);
|
|
PHY_WRITE_REG(CFG_BB_INT_EN_2_ADDR, 0);
|
|
PHY_WRITE_REG(CFG_BB_INT_EN_3_ADDR, 0);
|
|
#endif
|
|
|
|
switch(MAC_TX_TEST_ID)
|
|
{
|
|
case MAC_TX_BEACON:
|
|
case MAC_TX_SOF:
|
|
mac_tx_single_mode();
|
|
break;
|
|
case MAC_TX_TMI:
|
|
phy_interrupt_init();
|
|
mac_tx_tmi_scan();
|
|
break;
|
|
case MAC_TX_INTR_BCN_ALT:
|
|
mac_tx_bcn_alert();
|
|
break;
|
|
case MAC_TX_INTR_MPDU_COMPLETE:
|
|
mac_tx_complete();
|
|
break;
|
|
case MAC_TX_SCHED_BCN_AHEAD_ALERT:
|
|
mac_tx_sched();
|
|
break;
|
|
case MAC_TX_MIX_MODE:
|
|
mac_tx_mix();
|
|
break;
|
|
case MAC_TX_GP_EXT:
|
|
mac_tx_gp_ext();
|
|
break;
|
|
case MAC_TX_GP_TONE_MASK:
|
|
mac_tx_gp_tone_mask();
|
|
break;
|
|
case MAC_TX_BURN:
|
|
mac_tx_single_mode();
|
|
break;
|
|
case MAC_TX_BAND_SWITCH:
|
|
mac_tx_band_switch();
|
|
break;
|
|
case MAC_TX_PHY_TD_START:
|
|
phy_tx_td_start_test();
|
|
break;
|
|
case MAC_TX_EMC_SCAN:
|
|
phy_tx_emc_scan();
|
|
break;
|
|
case MAC_PHY_RST_FLOW:
|
|
mac_phy_rst_flow();
|
|
break;
|
|
case MAC_SOUND_TMAP:
|
|
mac_tmap_test();
|
|
break;
|
|
case MAC_TX_GP_HYBRID:
|
|
phy_gp_hybrid_mode_test();
|
|
break;
|
|
case PHY_BURST_MODE:
|
|
phy_gp_burst_mode_test();
|
|
break;
|
|
default:
|
|
while(true);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
#if !MODULE_EN
|
|
|
|
int main(void) {
|
|
mac_tx_start();
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|