Files
kunlun/dtest/mac_tx_test/hw2/hw_tx.c
2024-09-28 14:24:04 +08:00

749 lines
23 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 "mac_desc_engine.h"
#include "mac_hwq_mgr.h"
#include "mac_crc.h"
#include "mac_reset.h"
#include "mpdu_header.h"
#include "mac_reset.h"
#include "mac_cmn_hw.h"
#include "mac_hwq_reg.h"
#include "mac_sys_reg.h"
#include "mac_rx_reg.h"
#include "mac_tmr_reg.h"
#include "mac_avln.h"
#include "mac_key_hw.h"
#include "mac_key.h"
#include "phy_pm.h"
#include "hw_tx.h"
#include "tx_entry.h"
#include "iot_io.h"
#include "os_mem.h"
#include "intc_reg.h"
#include "phy_int.h"
#include "mac_raw_reg.h"
#include "phy_reg.h"
#include "phy_status.h"
#include "rgf_mac_int.h"
#include "phy_rxtd_reg.h"
#include "phy_dfe_reg.h"
#include "granite_reg.h"
#include "phy_ana_glb.h"
#include "mac_hwq_reg.h"
#include "phy_ana.h"
#include "phy_txrx_pwr.h"
#include "phy_tmap.h"
#include "phy_ana_reg.h"
#include "clk.h"
#include "phy_agc.h"
extern tonemap_table_entry gp_tonemap_table[];
uint32_t mac_tx_mpdu_test(void *pdev, volatile tx_mpdu_start *mpdu) {
(void)pdev;
uint32_t tmp = 0;
uint32_t pb_size = 0;
uint32_t tmi = 0, ext_tmi = 0;
uint32_t pb_mod = 0, tx_pwr = 0;
uint32_t rate_mode = glb_cfg.rate_mode;
#if (SUPPORT_SMART_GRID)
volatile frame_control_t *sg_fc = \
(frame_control_t*)(&(mpdu->fc0));
#endif
#if (SUPPORT_SOUTHERN_POWER_GRID)
volatile spg_frame_control_t *spg_fc = \
(spg_frame_control_t*)(&(mpdu->fc0));
#endif
#if (SUPPORT_GREEN_PHY)
volatile hpav_frame_control *hpav_fc = \
(hpav_frame_control*)(&(mpdu->fc0));
#endif
/* TODO: use mac global API */
mpdu->desc_type = DESC_TYPE_TX_MPDU_START;
mpdu->proto_type = glb_cfg.m_type;
mpdu->tx_port = HW_DESC_TX_PORT_PLC;
mpdu->tx_phase = glb_cfg.phase;
if (1 == g_phy_cpu_share_ctxt.pt_mode_entry) {
tx_pwr = PHY_FULL_PWR_DBUV - PHY_MP_PWR_REDUCE;
} else {
tx_pwr = PHY_FULL_PWR_DBUV;
}
phy_set_tx_pwr_limit(tx_pwr);
if(glb_cfg.ack_en == true)
mpdu->need_ack = 1;
mpdu->ppdu_mode = glb_cfg.ppdu_mode;
mpdu->next = 0;
/* clear the mpdu_end */
if (mpdu->tx_status) {
phy_tx_done_clr(mpdu);
//TODO:update
//mpdu->tx_status->tx_ok = 0;
}
/* tmi info */
tmi = glb_cfg.tmi;
if(glb_cfg.m_type == PLC_PROTO_TYPE_SG)
{
if (tmi >= 15) {
/* if use ext_tmi */
tmi = 15;
ext_tmi = glb_cfg.tmi - 15;
}
} else if (glb_cfg.m_type == PLC_PROTO_TYPE_SPG) {
IOT_ASSERT(tmi <= 10 || tmi >= 16 );
if (tmi > 10) {
/* if use ext_tmi */
tmi = 13;
ext_tmi = glb_cfg.tmi - 15;
}
}
/* only contains the pb's size */
phy_get_pb_size(glb_cfg.m_type, tmi, ext_tmi, &pb_size);
mpdu->pb_num = glb_cfg.pb_num;
mpdu->total_bytes = pb_size*glb_cfg.pb_num;
/* start/end time, ignore in GP's case */
//mpdu->start_time = 0;
//mpdu->end_time = 0;
/* TODO: amplitude table select */
mpdu->tx_tone_amp = 0;
/* band info */
#if MAC_MULTI_BAND_SUPPORT == 1
mpdu->sg_bandsel = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR)%3;
#else
mpdu->sg_bandsel = 0;
#endif
mpdu->sym_num_ppb = phy_get_sym_per_pb( \
glb_cfg.m_type, mpdu->sg_bandsel, tmi, ext_tmi,
phy_get_pss_id(glb_cfg.m_type, tmi, ext_tmi));
if(mpdu->sym_num_ppb * glb_cfg.pb_num >= 512){
iot_printf("[TMI-%d][PB-%d][error]:symbol size %d bigger than 512.", \
ext_tmi+tmi,glb_cfg.pb_num,mpdu->sym_num_ppb * glb_cfg.pb_num);
return ERR_INVAL;
}
#if (SUPPORT_GREEN_PHY)
if (glb_cfg.m_type == PLC_PROTO_TYPE_GP) {
if (glb_cfg.tmi >= 4) {
mpdu->tx_fl = (uint32_t)(hpav_cal_fl_tmap( \
glb_cfg.mpdu_cnt - 1, glb_cfg.pb_num, \
glb_cfg.turbo_rate, glb_cfg.gi, \
phy_symb_bits_get((uint32_t *)PHY_TMAP_TEST_ADDR)) * 1.28 - 20);
} else {
mpdu->tx_fl = (uint32_t)(hpav_cal_fl_robo( \
glb_cfg.tmi, glb_cfg.mpdu_cnt, glb_cfg.pb_num) * 1.28 - 160);
}
} else {
mpdu->tx_fl = (uint32_t)phy_get_fl_per_pb( \
glb_cfg.m_type, mpdu->sg_bandsel, tmi, ext_tmi) * glb_cfg.pb_num;
}
#else
mpdu->tx_fl = (uint32_t)phy_get_fl_per_pb( \
glb_cfg.m_type, mpdu->sg_bandsel, tmi, ext_tmi) * glb_cfg.pb_num;
#endif
#if (SUPPORT_SMART_GRID)
if(glb_cfg.m_type == PLC_PROTO_TYPE_SG)
{
if(glb_cfg.p_type == FC_DELIM_BEACON)
{
sg_fc->delimiter_type = FC_DELIM_BEACON; /*beacon*/
sg_fc->vf.bcn.time_stamp = 0;
sg_fc->vf.bcn.src_tei = glb_cfg.src_tei;
sg_fc->vf.bcn.tmi = tmi;
sg_fc->vf.bcn.sym_num = 0;
sg_fc->vf.bcn.phase_num = 0;
sg_fc->vf.bcn.version = 0;
}
else if(glb_cfg.p_type == FC_DELIM_SOF)
{
sg_fc->delimiter_type = FC_DELIM_SOF; /*sof*/
sg_fc->vf.sof.src_tei = glb_cfg.src_tei;
sg_fc->vf.sof.dst_tei = glb_cfg.dst_tei;
sg_fc->vf.sof.lid = 0;
sg_fc->vf.sof.frame_len = 0;
sg_fc->vf.sof.pb_num = glb_cfg.pb_num;
sg_fc->vf.sof.sym_num = 0;
sg_fc->vf.sof.bcast = 0;
sg_fc->vf.sof.tmi = tmi;
sg_fc->vf.sof.tmi_ext = ext_tmi;
sg_fc->vf.sof.version = 0;
}
else if(glb_cfg.p_type == FC_DELIM_SOUND)
{
sg_fc->delimiter_type = FC_DELIM_SOUND; /*sound*/
sg_fc->vf.sof.src_tei = glb_cfg.src_tei;
sg_fc->vf.sof.dst_tei = glb_cfg.dst_tei;
sg_fc->vf.sof.lid = 0;
sg_fc->vf.sof.frame_len = 0;
sg_fc->vf.sof.pb_num = glb_cfg.pb_num;
sg_fc->vf.sof.sym_num = 0;
sg_fc->vf.sof.bcast = 0;
sg_fc->vf.sof.tmi = tmi;
sg_fc->vf.sof.tmi_ext = ext_tmi;
sg_fc->vf.sof.version = 0;
}
sg_fc->network_type = 0;
sg_fc->nid = glb_cfg.nid;
IOT_ASSERT(sg_fc->vf.sof.pb_num <= 4);
} else
#endif
#if (SUPPORT_SOUTHERN_POWER_GRID)
if (glb_cfg.m_type == PLC_PROTO_TYPE_SPG)
{
if(glb_cfg.p_type == FC_DELIM_BEACON)
{
spg_fc->delimiter_type = FC_DELIM_BEACON; /*beacon*/
spg_fc->vf.bcn.time_stamp = 0;
spg_fc->vf.bcn.src_tei = glb_cfg.src_tei;
spg_fc->vf.bcn.tmi = tmi;
spg_fc->vf.bcn.sym_num = 0;
spg_fc->vf.bcn.phase_num = 0;
spg_fc->vf.bcn.version = 0;
}
else if(glb_cfg.p_type == FC_DELIM_SOF)
{
spg_fc->delimiter_type = FC_DELIM_SOF; /*sof*/
spg_fc->vf.sof.src_tei = glb_cfg.src_tei;
spg_fc->vf.sof.dst_tei = glb_cfg.dst_tei;
spg_fc->vf.sof.lid = 0;
spg_fc->vf.sof.frm_len = 0;
spg_fc->vf.sof.pb_num = glb_cfg.pb_num;
spg_fc->vf.sof.sym_num = 0;
spg_fc->vf.sof.tmi = tmi;
spg_fc->vf.sof.tmi_ext = ext_tmi;
spg_fc->vf.sof.version = 0;
}
spg_fc->access_ind = 1;
spg_fc->snid = glb_cfg.nid;
} else
#endif
#if (SUPPORT_GREEN_PHY)
{
/* AV FC */
if(glb_cfg.p_type == DT_AV_BEACON)
{
hpav_fc->delimiter_type = DT_AV_BEACON;
}
else if(glb_cfg.p_type == DT_AV_SOF)
{
hpav_fc->delimiter_type = DT_AV_SOF;
hpav_fc->vf_av.sof.src_tei = glb_cfg.src_tei;
hpav_fc->vf_av.sof.dst_tei = glb_cfg.dst_tei;
hpav_fc->vf_av.sof.lid = 0;
hpav_fc->vf_av.sof.eks = 0xf;
if(gp_tonemap_table[tmi].pb_size == 520)
hpav_fc->vf_av.sof.pbsz = 0;
else if(gp_tonemap_table[tmi].pb_size == 136)
hpav_fc->vf_av.sof.pbsz = 1;
else
IOT_ASSERT(0);
hpav_fc->vf_av.sof.numsym = 3;
hpav_fc->vf_av.sof.tmi_av = glb_cfg.tmi;
if (glb_cfg.tmi >= 4) {
hpav_fc->vf_av.sof.fl_av = \
hpav_cal_fl_tmap(glb_cfg.mpdu_cnt-1, glb_cfg.pb_num, \
glb_cfg.turbo_rate, glb_cfg.gi, \
phy_symb_bits_get((uint32_t *)PHY_TMAP_TEST_ADDR));
} else {
hpav_fc->vf_av.sof.fl_av = \
hpav_cal_fl_robo(glb_cfg.tmi, glb_cfg.mpdu_cnt, glb_cfg.pb_num);
}
}
else if(glb_cfg.p_type == DT_AV_RTS_CTS)
{
hpav_fc->delimiter_type = DT_AV_RTS_CTS;
hpav_fc->vf_av.rtscts.src_tei = glb_cfg.src_tei;
hpav_fc->vf_av.rtscts.dst_tei = glb_cfg.dst_tei;
hpav_fc->vf_av.rtscts.lid = 0;
hpav_fc->vf_av.rtscts.rtsf = 1;
hpav_fc->vf_av.rtscts.dur = 300;
}
else if(glb_cfg.p_type == DT_AV_SOUND)
{
hpav_fc->delimiter_type = DT_AV_SOUND;
hpav_fc->vf_av.sound.stei = glb_cfg.src_tei;
hpav_fc->vf_av.sound.dtei = glb_cfg.dst_tei;
hpav_fc->vf_av.sound.lid = 0;
if(tmi == 0 || tmi == 1)
{
hpav_fc->vf_av.sound.pbsz = 0;
phy_pld_gi1_set(GI_HS_ROBO);
}
else if(tmi == 2)
{
hpav_fc->vf_av.sound.pbsz = 1;
phy_pld_gi1_set(GI_MINI_ROBO);
}
hpav_fc->vf_av.sound.req_tm = 1;
hpav_fc->vf_av.sound.fl_av = 0;
hpav_fc->vf_av.sound.src = 0xFD;//as part of Initial Channel Estimation
}
hpav_fc->access = 1;
hpav_fc->snid = glb_cfg.nid;
}
#endif
{ /* for MACRO format */ }
/* hw id */
mpdu->swq_id = 0;
/* hw retry cnt */
mpdu->hw_retry_cnt = 0;
/* set the crc hdr len, GP is 4 for bcn */
if(glb_cfg.m_type == PLC_PROTO_TYPE_SG)
{
if(glb_cfg.p_type == FC_DELIM_BEACON)
{
mpdu->pb_hdr_crc_len = 3;
}
else if((glb_cfg.p_type == FC_DELIM_SOF)||(glb_cfg.p_type == FC_DELIM_SOUND))
{
mpdu->pb_hdr_crc_len = 4;
}
}
else if(glb_cfg.m_type == PLC_PROTO_TYPE_SPG)
{
if(glb_cfg.p_type == FC_DELIM_BEACON)
{
mpdu->pb_hdr_crc_len = 3;
}
else if((glb_cfg.p_type == FC_DELIM_SOF)||(glb_cfg.p_type == FC_DELIM_SOUND))
{
/* communicate with hs */
mpdu->pb_hdr_crc_len = 8;
}
}
else{
if(glb_cfg.p_type == DT_AV_BEACON)
{
mpdu->pb_hdr_crc_len = 4;
}
else if(glb_cfg.p_type == DT_AV_SOF)
{
mpdu->pb_hdr_crc_len = 8;
}
}
/* pb modulation and rate */
phy_get_pb_mod(glb_cfg.m_type,tmi, ext_tmi, &pb_mod);
mpdu->tx_pld_module_mode = pb_mod;
#if MAC_RATE_RANDOM_SUPPORT == 1
mpdu->tx_rate_mode = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR)%2;
(void)rate_mode;
#else
mpdu->tx_rate_mode = (rate_mode == 2)?1:rate_mode;
#endif
/* QR optimize */
if(rate_mode == IOT_SUPPORT_RATE_QR){
phy_qr_common_init();
}
else if(rate_mode == IOT_SUPPORT_RATE_XR){
tmp = RGF_MAC_READ_REG(CFG_PHY_CTRL_ADDR);
REG_FIELD_SET(CFG_MULTI_RATE_BASE_SPEED, tmp, 1);
RGF_MAC_WRITE_REG(CFG_PHY_CTRL_ADDR,tmp);
}
/* update cnt */
band_cnt[mpdu->tx_rate_mode][mpdu->sg_bandsel] += 1;
/* set hwq0's ptr list */
RGF_HWQ_WRITE_REG(CFG_HWQ0_PTR_ADDR, (uint32_t)mpdu);
/* read NTB and fill in the start and end time
* by max time span value
*/
tmp = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
RGF_HWQ_WRITE_REG(CFG_HWQ0_START_ADDR, tmp);
RGF_HWQ_WRITE_REG(CFG_HWQ0_END_ADDR, (tmp + (0xffffffff >> 1) - 1));
#if IOT_DTEST_ONLY_SUPPORT == 1
/* update the beacon content */
uint32_t i = 0, j = 0;
if(glb_cfg.p_type == FC_DELIM_BEACON) {
tx_pb_start *current_pb_ptr = (tx_pb_start *)mpdu->pb_list;
hp_beacon_payload_fixed_header *pb_addr =
(hp_beacon_payload_fixed_header *)(current_pb_ptr->pb_buf_addr);
pb_addr->nid = PHY_TXRX_NID_VAL;
pb_addr->hm = 0;
pb_addr->stei = 1;
/* pb crc */
pb_addr->bmi.opad[0] = \
iot_getcrc32((uint8_t *)(pb_addr->bmi.opad), \
sizeof(pb_addr->bmi.opad) - 4);
/* init pb_buf with 4 pb */
for (i = 1; i < sizeof(pb_addr->bmi.opad)/4 - 1; i++)
{
pb_addr->bmi.opad[i] = pb_addr->bmi.opad[0]+i;
}
} else {
tx_pb_start *current_pb_ptr = (tx_pb_start *)mpdu->pb_list;
uint32_t *pb_other_buf = (uint32_t *)(current_pb_ptr->pb_buf_addr);
uint8_t pb_idx = (MAC_PB_NUM_ID > 4) ? 4 : MAC_PB_NUM_ID;
for (j = 0; j < pb_idx; j++)
{
for (i = 1; i < pb_size >> 2; i++)
{
pb_other_buf[i] = 0x55555555;//tmp + i;
}
pb_other_buf[0] = \
iot_getcrc32((uint8_t *)(pb_other_buf + 1), pb_size - 8);
/* update the next pb */
current_pb_ptr = (tx_pb_start *)current_pb_ptr->next_pb;
if(current_pb_ptr) {
pb_other_buf = (uint32_t *)(current_pb_ptr->pb_buf_addr);
}
}
}
#endif
return ERR_OK;
}
void dt_mac_tx_hwq0_re_trig()
{
uint32_t tmp = 0;
int64_t time_span = 0;
uint32_t start_time = 0, end_time = 0;
/* start time */
start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);/*for cnt*/
/* trigger hwq0 send */
tmp = RGF_HWQ_READ_REG(CFG_HWQ0_ADDR);
if (REG_FIELD_GET(CFG_DBG_HWQ0_EN, tmp)) {
/* if enable then disable first */
REG_FIELD_SET(CFG_DBG_HWQ0_EN, tmp, 0); // disable hwq
RGF_HWQ_WRITE_REG(CFG_HWQ0_ADDR, tmp);
}
/* 10us with 0.04us unit */
while ((uint64_t)time_span < 250)
{
/* dly or tx fail if too quick */
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;
}
}
REG_FIELD_SET(CFG_DBG_HWQ0_EN, tmp, 1); // enable hwq
RGF_HWQ_WRITE_REG(CFG_HWQ0_ADDR, tmp);
if(glb_cfg.hwq_num > 1) {
/* trigger hwq1 send */
tmp = RGF_HWQ_READ_REG(CFG_HWQ1_ADDR);
if (REG_FIELD_GET(CFG_DBG_HWQ1_EN, tmp)) {
/* if enable then disable first */
REG_FIELD_SET(CFG_DBG_HWQ1_EN, tmp, 0); // disable hwq
RGF_HWQ_WRITE_REG(CFG_HWQ1_ADDR, tmp);
}
REG_FIELD_SET(CFG_DBG_HWQ1_EN, tmp, 1); // enable hwq
RGF_HWQ_WRITE_REG(CFG_HWQ1_ADDR, tmp);
}
}
void dt_mac_hwq0_ptr_set(uint32_t addr)
{
/* set hwq0's ptr list */
RGF_HWQ_WRITE_REG(CFG_HWQ0_PTR_ADDR, addr);
}
void dt_mac_hwq1_ptr_set(uint32_t addr)
{
/* set hwq1's ptr list */
RGF_HWQ_WRITE_REG(CFG_HWQ1_PTR_ADDR, addr);
}
void dtest_mac_bifs_set(uint16_t bifs)
{
uint32_t tmp = 0;
tmp = RGF_TMR_READ_REG(CFG_TIMER5_ADDR);
REG_FIELD_SET(CFG_TX_BIFS_TIMER, tmp, bifs);
RGF_TMR_WRITE_REG(CFG_TIMER5_ADDR, tmp);
}
void mac_tx_burn_init()
{
uint32_t tmp = 0;
#if 0
phy_txrx_ovr_set(1,2);
phy_gain_shift_set(0, 0, 0, 10);
#else
tmp = RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR);
REG_FIELD_SET(CFG_PHY_PCS_BUSY, tmp, 0);
REG_FIELD_SET(CFG_PHY_PCS_BUSY_FORCE_EN, tmp, 1);
REG_FIELD_SET(CFG_PHY_RX_VLD, tmp, 0);
REG_FIELD_SET(CFG_PHY_RX_VLD_FORCE_EN, tmp, 1);
REG_FIELD_SET(CFG_PHY_RX_FRAME, tmp, 0);
REG_FIELD_SET(CFG_PHY_RX_FRAME_FORCE_EN, tmp, 1);
REG_FIELD_SET(CFG_PHY_RX_READY, tmp, 1);
REG_FIELD_SET(CFG_PHY_RX_READY_FORCE_EN, tmp, 1);
REG_FIELD_SET(CFG_PHY_RX_ENABLE, tmp, 0);
REG_FIELD_SET(CFG_PHY_RX_ENABLE_FORCE_EN, tmp, 1);
RGF_MAC_WRITE_REG(CFG_PHY_FORCE_0_ADDR, tmp);
tmp = RGF_MAC_READ_REG(CFG_PHY_FORCE_1_ADDR);
REG_FIELD_SET(CFG_PHY_TX_ENABLE, tmp, 1);
REG_FIELD_SET(CFG_PHY_TX_ENABLE_FORCE_EN, tmp, 1);
RGF_MAC_WRITE_REG(CFG_PHY_FORCE_1_ADDR, tmp);
tmp = RGF_MAC_READ_REG(CFG_PHY_FORCE_2_ADDR);
REG_FIELD_SET(CFG_PHY_TX_PHASE_SEL, tmp, 1);
REG_FIELD_SET(CFG_PHY_TX_PHASE_SEL_FORCE_EN, tmp, 1);
RGF_MAC_WRITE_REG(CFG_PHY_FORCE_2_ADDR, tmp);
#if 0
/* en analog tx/rx */
uint8_t reg_id = ANA_GRANITE_TOP_REG;
uint32_t wdata = TOP_EN_TX_MASK | TOP_EN_DAC_MASK | \
TOP_EN_RX_MASK | TOP_EN_ADC_MASK | TOP_ENLIC_MASK;
uint32_t wmask = TOP_EN_TX_MASK | TOP_EN_DAC_MASK | \
TOP_EN_RX_MASK | TOP_EN_ADC_MASK | TOP_ENLIC_MASK;
phy_ana_i2c_write(reg_id,wdata,wmask);
#endif
#endif
}
void mac_tx_path_init()
{
uint32_t tmp = 0;
/* enable DCU debug mode */
if(glb_cfg.t_type == MAC_TX_SCHED_BCN_AHEAD_ALERT) {
mac_txq_set_dbg_mode(0);// commandlist enable
} else {
mac_txq_set_dbg_mode(1);// debug enable
}
/* set hwq 0 's config */
/* set hwq0's type, cap */
tmp = RGF_HWQ_READ_REG(CFG_HWQ0_ADDR);
REG_FIELD_SET(CFG_DBG_HWQ0_TYPE, tmp, 0); // 0:TDMA, 1:CSMA
REG_FIELD_SET(CFG_DBG_HWQ0_CAP, tmp, 1); // CAP1 as default
RGF_HWQ_WRITE_REG(CFG_HWQ0_ADDR, tmp);
if(glb_cfg.hwq_num > 1) {
/* set hwq1's type, cap */
tmp = RGF_HWQ_READ_REG(CFG_HWQ1_ADDR);
REG_FIELD_SET(CFG_DBG_HWQ1_TYPE, tmp, 0); // 0:TDMA, 1:CSMA
REG_FIELD_SET(CFG_DBG_HWQ1_CAP, tmp, 1); // CAP1 as default
RGF_HWQ_WRITE_REG(CFG_HWQ1_ADDR, tmp);
}
/* set beacon period */
RGF_MAC_WRITE_REG(CFG_BEACON_PERIOD_ADDR, bcn_period_ms * TICKS_MS);
/* config my nid */
mac_config_nid(NULL, PHY_TXRX_NID_VAL);
/* tei cfg */
mac_config_tei(NULL, glb_cfg.src_tei);
/* enable and trigger the HW to load it */
tmp = RGF_MAC_READ_REG(CFG_TMI_CTRL_ADDR);
REG_FIELD_SET(CFG_TONE_AMP_EN, tmp, 0);
RGF_MAC_WRITE_REG(CFG_TMI_CTRL_ADDR, tmp);
/* delete timeout for long pkt */
RGF_TMR_WRITE_REG(CFG_TX_TIMEOUT_0_ADDR,0x0);
RGF_TMR_WRITE_REG(CFG_TX_TIMEOUT_1_ADDR,0x0);
RGF_TMR_WRITE_REG(CFG_TX_TIMEOUT_2_ADDR,0x0);
RGF_TMR_WRITE_REG(CFG_PHY_TX_TIMEOUT_ADDR,0x0);
#if MAC_TX_TEST_ID == MAC_TX_BURN
/* force tx */
mac_tx_burn_init();
#endif
/* set txq self poll interval */
mac_txq_set_poll_intval(1023); /* 1023 us */
/* check phy pwr sts */
phy_pm_pwr_update(PHY_PM_PWR_STS_TXRX);
/* mac auto trig */
mac_sw_trig_need_en(false);
mac_sw_trig_start(true);
/* clr phy cnt */
phy_tx_dbg_cnt_clr();
/* sw frame length en */
if (PHY_PROTO_TYPE_GET() == PLC_PROTO_TYPE_GP) {
mac_set_fc_fl_cfg_status(true);
}
/* hw retry */
tmp = RGF_MAC_READ_REG(CFG_TX_CTRL1_ADDR);
REG_FIELD_SET(CFG_HWRETRY_MODIFY, tmp , 0);
RGF_MAC_WRITE_REG(CFG_TX_CTRL1_ADDR, tmp);
}
void platform_tx_pre_init()
{
/* change clk to 150M */
clk_core_freq_set(CPU_FREQ_150M);
/* alloc 1K size ram */
os_mem_init((uint8_t *)0xffffc00,0x1000);
/* reset phy */
phy_reset(PHY_RST_REASON_COLD);
/* reset mac */
mac_reset(MAC_RST_REASON_COLD);
}
bool_t phy_get_tx_done_from_mpdu(volatile tx_mpdu_start *mpdu)
{
return ((tx_mpdu_end*)mpdu->tx_status)->tx_done;
}
void phy_tx_done_clr(volatile tx_mpdu_start *mpdu)
{
((tx_mpdu_end*)mpdu->tx_status)->tx_done = 0;
}
uint32_t mpdu_pb_list_get_from_pb_start(tx_pb_start *pb_start)
{
return (uint32_t)pb_start;
}
uint32_t mpdu_tx_status_get_from_mpdu_end(tx_mpdu_end *mpdu_end)
{
return (uint32_t)mpdu_end;
}
uint32_t tx_complete_handler(uint32_t vector, iot_addrword_t data)
{
#if IOT_DTEST_ONLY_SUPPORT == 1
uint32_t status;
status = RGF_MAC_READ_REG(CFG_MAC_INT_STS_ADDR);
//iot_printf("intc status=0x%x\r\n",status);
if(status & (0x1 <<5)){
/* clear intr */
RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, 0x1<<5);
RGF_HWQ_WRITE_REG(CFG_HWQ_TX_DONE_INT_CLR_ADDR,0xf);
if(!phy_get_tx_done_from_mpdu(mpdu_start))
iot_printf("Intr complete,but tx not done!\r\n");
phy_tx_done_clr(mpdu_start);
mac_tx_complete_flag = true;
}
if(status & (0x1 <<0)){
/* clear intr */
RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, 0x1<<0);
mac_beacon_alert_flag = true;
}
if(status & (0x1 <<4)){
/* clear intr */
RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, 0x1<<4);
mac_beacon_alert_flag = true;
}
#if MODULE_EN
/* single interrupt handler */
INTC_WRITE_REG(CFG_INT_ENA0_ADDR,0x0);
#endif
#endif
return 0;
}
void mac_interrupt_init()
{
#if IOT_DTEST_ONLY_SUPPORT == 1
uint32_t tmp = 0;
iot_mac_intr_info_t mac_info;
os_mem_set(&mac_info, 0x0, sizeof(iot_mac_intr_info_t));
/* intc en */
INTC0_WRITE_REG(CFG_INT_ENA0_ADDR,MPDU_TX_DONE_MASK | BEACON_ALERT_MASK);
/* clr mac int */
RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, MPDU_TX_DONE_MASK);//tx complete
RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, BEACON_ALERT_MASK);//tx beacon alert
/* MPDU done intr enable */
tmp = RGF_MAC_READ_REG(CFG_INT_ENA_MASK_ADDR);
if(glb_cfg.t_type == MAC_TX_INTR_MPDU_COMPLETE)
REG_FIELD_SET(CFG_INT_ENABLE_MASK,tmp,MPDU_TX_DONE_MASK);
else if(glb_cfg.t_type == MAC_TX_INTR_BCN_ALT)
REG_FIELD_SET(CFG_INT_ENABLE_MASK,tmp,BEACON_ALERT_MASK);
else if(glb_cfg.t_type == MAC_TX_SCHED_BCN_AHEAD_ALERT)
REG_FIELD_SET(CFG_INT_ENABLE_MASK,tmp,MPDU_TX_DONE_MASK);
RGF_MAC_WRITE_REG(CFG_INT_ENA_MASK_ADDR, tmp);
/* pri int */
tmp = RGF_MAC_READ_REG(CFG_INT_PRI1_MASK_ADDR);
REG_FIELD_SET(CFG_INT_PRI1_MASK,tmp,BEACON_ALERT_MASK | MPDU_TX_DONE_MASK);
RGF_MAC_WRITE_REG(CFG_INT_PRI1_MASK_ADDR, tmp);
/* interrupt controller */
mac_info.int_num = HAL_VECTOR_MAC_1;
mac_info.handle = iot_interrupt_create( mac_info.int_num, 0, \
(iot_addrword_t)&mac_info, tx_complete_handler);
iot_interrupt_attach( mac_info.handle);
iot_interrupt_unmask( mac_info.handle);
#endif
}
uint32_t IRAM_ATTR phy_intr_handler(uint32_t vector, iot_addrword_t data)
{
return 0;
}
void phy_interrupt_init()
{
}
void mac_tmap_init()
{
uint32_t tmp = 0;
tmp = RGF_MAC_READ_REG(CFG_TONE_MAP_DMA_CTRL_ADDR);
REG_FIELD_SET(CFG_TMAP_LOAD_EN, tmp, 1);
RGF_MAC_WRITE_REG(CFG_TONE_MAP_DMA_CTRL_ADDR, tmp);
tmp = RGF_MAC_READ_REG(CFG_TMI_CTRL_ADDR);
REG_FIELD_SET(CFG_ENABLE_MAC_LOAD_TMI, tmp, 1);
RGF_MAC_WRITE_REG(CFG_TMI_CTRL_ADDR, tmp);
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 = 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);
}