687 lines
19 KiB
C
687 lines
19 KiB
C
/****************************************************************************
|
|
|
|
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.
|
|
|
|
****************************************************************************/
|
|
|
|
/* os shim includes */
|
|
#include "iot_config.h"
|
|
#include "os_types.h"
|
|
#include "iot_mem.h"
|
|
|
|
/* plc public api includes */
|
|
#include "plc_fr.h"
|
|
#include "plc_const.h"
|
|
#include "iot_bitops.h"
|
|
|
|
/* driver includes */
|
|
#include "iot_irq.h"
|
|
#include "iot_gpio_api.h"
|
|
#include "iot_board_api.h"
|
|
#include "pin_rf.h"
|
|
#include "iot_io.h"
|
|
|
|
#include "bb_cpu_utils.h"
|
|
#include "mac.h"
|
|
#include "mac_rf_hwq_mgr.h"
|
|
#include "mac_rf_txq_hw.h"
|
|
#include "rfplc_reg_base.h"
|
|
#include "hw_reg_api.h"
|
|
#include "bb_cpu_mac_init.h"
|
|
#include "bb_cpu_mac_isr.h"
|
|
#include "bb_cpu_timer.h"
|
|
#include "bb_cpu_fsm.h"
|
|
#include "rf_mac_reg.h"
|
|
#include "mac_sys_reg.h"
|
|
#include "bb_rf_cfg.h"
|
|
#include "bb_cpu_hw_ring.h"
|
|
#include "mac_rf_common_hw.h"
|
|
#include "wmac_reg.h"
|
|
#include "bb_cpu_config.h"
|
|
#include "mpdu_header.h"
|
|
|
|
#define BB_CPU_CHECK_WMAC_FSM_DUE_TO_CMDLIST_DONE 1
|
|
#define BB_CPU_CHECK_WMAC_FSM_DUE_TO_EARLY_STOP 2
|
|
|
|
uint32_t bb_cpu_mac_get_txq_ptr()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_CUR_TX_PTR_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_crc32_check()
|
|
{
|
|
// TODO: get rx crc32 need check or not
|
|
return 0;
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_cur_hwqid()
|
|
{
|
|
uint32_t tmp, sel_bitmap, hwq_id = MAX_MAC_RF_TXQ_NUM;
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_DEBUG_BUS0_ADDR);
|
|
sel_bitmap = REG_FIELD_GET(RF_MAC_TXQ_SEL_BIT_MAP, tmp);
|
|
if (sel_bitmap) {
|
|
hwq_id = iot_bitops_fls(sel_bitmap) - 1;
|
|
if (sel_bitmap & (~(1 << hwq_id))) {
|
|
iot_printf("selbit err:0x%x, cmdbitmap:0x%x\n", sel_bitmap,
|
|
REG_FIELD_GET(RF_MAC_TXQ_BITMAP_2CPU2, tmp));
|
|
IOT_ASSERT(0);
|
|
}
|
|
} else {
|
|
iot_printf("selbit is 0\n");
|
|
IOT_ASSERT(0);
|
|
}
|
|
|
|
return hwq_id;
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_judge_cur_cmd_need_tx_csma()
|
|
{
|
|
uint32_t tmp, txq_bit_map, ret = 0;
|
|
if (mac_rf_txq_is_dbg_mode()) {
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_DEBUG_CFG_ADDR);
|
|
txq_bit_map = REG_FIELD_GET(RF_MAC_DEBUG_TXQ_BITMAP, tmp);
|
|
} else {
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_DEBUG_BUS0_ADDR);
|
|
txq_bit_map = REG_FIELD_GET(RF_MAC_TXQ_BITMAP_2CPU2, tmp);
|
|
}
|
|
if (txq_bit_map & (1 << MAC_RF_QUE_CSMA_0) ||
|
|
txq_bit_map & (1 << MAC_RF_QUE_CSMA_1) ||
|
|
txq_bit_map & (1 << MAC_RF_QUE_CSMA_2) ||
|
|
txq_bit_map & (1 << MAC_RF_QUE_CSMA_3) ||
|
|
txq_bit_map & (1 << MAC_RF_QUE_CSMA_DBG) ||
|
|
txq_bit_map & (1 << MAC_RF_QUE_BCSMA)) {
|
|
ret = 1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_judge_cur_cmd_need_tx_tdma()
|
|
{
|
|
uint32_t tmp, txq_bit_map, ret = 0;
|
|
if (mac_rf_txq_is_dbg_mode()) {
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_DEBUG_CFG_ADDR);
|
|
txq_bit_map = REG_FIELD_GET(RF_MAC_DEBUG_TXQ_BITMAP, tmp);
|
|
} else {
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_DEBUG_BUS0_ADDR);
|
|
txq_bit_map = REG_FIELD_GET(RF_MAC_TXQ_BITMAP_2CPU2, tmp);
|
|
}
|
|
if (txq_bit_map & (1 << MAC_RF_QUE_BCN) ||
|
|
txq_bit_map & (1 << MAC_RF_QUE_TDMA)) {
|
|
ret = 1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_judge_next_cmd_is_vld()
|
|
{
|
|
uint32_t tmp, is_vld;
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_DEBUG_BUS1_ADDR);
|
|
is_vld = REG_FIELD_GET(RF_MAC_NEXT_CMD_VLD_2CPU2, tmp);
|
|
(void)is_vld;
|
|
/* NOTE: this function is bad */
|
|
return 0;
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_judge_next_cmd_need_tx_tdma()
|
|
{
|
|
uint32_t tmp, is_vld, txq_bit_map, ret = 0;
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_DEBUG_BUS1_ADDR);
|
|
is_vld = REG_FIELD_GET(RF_MAC_NEXT_CMD_VLD_2CPU2, tmp);
|
|
if (is_vld) {
|
|
txq_bit_map = REG_FIELD_GET(RF_MAC_NEXT_TXQ_BITMAP_2CPU2, tmp);
|
|
if (txq_bit_map & (1 << MAC_RF_QUE_BCN) ||
|
|
txq_bit_map & (1 << MAC_RF_QUE_TDMA)) {
|
|
ret = 1;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rest_slot_time()
|
|
{
|
|
uint32_t remain_time = RF_MAC_READ_REG(CFG_RF_MAC_SLICE_TIME_LEFT_ADDR);
|
|
/* uint us */
|
|
return remain_time/25;
|
|
}
|
|
|
|
void bb_cpu_mac_inter_pkt_interval(uint32_t interval)
|
|
{
|
|
/* uint us */
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_PKT_INTERVAL_TIME_ADDR, (interval * 25));
|
|
}
|
|
|
|
/* NOTE: CFG_RF_MAC_TXRX_CTL_ADDR need atomic operations
|
|
*
|
|
* this function in isr, so it do not need stop bbcpu irq.
|
|
*/
|
|
void bb_cpu_mac_set_vcs_sts_from_isr(uint32_t is_busy)
|
|
{
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_TXRX_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_VCS_STATUS, tmp, is_busy);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_TXRX_CTL_ADDR, tmp);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_vcs_sts()
|
|
{
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_TXRX_CTL_ADDR);
|
|
return REG_FIELD_GET(RF_MAC_VCS_STATUS, tmp);
|
|
}
|
|
|
|
void bb_cpu_mac_set_tx_done()
|
|
{
|
|
/* NOTE: make sure CFG_RF_MAC_TXRX_CTL_ADDR is atomic operations,
|
|
* we need stop bbcpu irq.
|
|
*/
|
|
/* disable irq */
|
|
bb_cpu_mac_isr_stop();
|
|
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_TXRX_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_TX_DONE_CPU2, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_TXRX_CTL_ADDR, tmp);
|
|
|
|
/* enable irq */
|
|
bb_cpu_mac_isr_start();
|
|
}
|
|
|
|
void bb_cpu_mac_set_rx_done()
|
|
{
|
|
/* NOTE: make sure CFG_RF_MAC_TXRX_CTL_ADDR is atomic operations,
|
|
* we need stop bbcpu irq.
|
|
*/
|
|
/* disable irq */
|
|
bb_cpu_mac_isr_stop();
|
|
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_TXRX_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_RX_DONE_CPU2, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_TXRX_CTL_ADDR, tmp);
|
|
|
|
/* enable irq */
|
|
bb_cpu_mac_isr_start();
|
|
}
|
|
|
|
void bb_cpu_mac_set_tx_abort_done()
|
|
{
|
|
/* NOTE: make sure CFG_RF_MAC_TXRX_CTL_ADDR is atomic operations,
|
|
* we need stop bbcpu irq.
|
|
*/
|
|
/* disable irq */
|
|
bb_cpu_mac_isr_stop();
|
|
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_TXRX_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_TX_ABORT_DONE_CPU2, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_TXRX_CTL_ADDR, tmp);
|
|
|
|
/* enable irq */
|
|
bb_cpu_mac_isr_start();
|
|
}
|
|
|
|
void bb_cpu_mac_set_rx_abort_done()
|
|
{
|
|
/* NOTE: make sure CFG_RF_MAC_TXRX_CTL_ADDR is atomic operations,
|
|
* we need stop bbcpu irq.
|
|
*/
|
|
/* disable irq */
|
|
bb_cpu_mac_isr_stop();
|
|
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_TXRX_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_RX_ABORT_DONE_CPU2, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_TXRX_CTL_ADDR, tmp);
|
|
|
|
/* enable irq */
|
|
bb_cpu_mac_isr_start();
|
|
}
|
|
|
|
static uint32_t bb_cpu_mac_check_fsm(uint32_t reason, uint32_t is_assert)
|
|
{
|
|
#define RESET_FSM_TIME_NTB 250 // 10US * 25
|
|
uint32_t start_ntb, cur_ntb, time_span;
|
|
uint32_t wmac_fsm;
|
|
|
|
/* wait reset fsm complete */
|
|
start_ntb = RGF_MAC_READ_REG(CFG_RD_LOCAL_TMR_ADDR);
|
|
do {
|
|
/* reset txrx fsm */
|
|
mac_rf_reset_txrxfsm();
|
|
cur_ntb = RGF_MAC_READ_REG(CFG_RD_LOCAL_TMR_ADDR);
|
|
time_span = cur_ntb - start_ntb;
|
|
wmac_fsm = mac_rf_wmac_get_fsm();
|
|
} while (wmac_fsm && time_span < RESET_FSM_TIME_NTB);
|
|
|
|
/* just check wmac fsm */
|
|
if (wmac_fsm) {
|
|
bb_cpu_printf("reason:%d, fsm:0x%x, lft:%lu\n", reason, wmac_fsm,
|
|
bb_cpu_mac_get_rest_slot_time());
|
|
if (is_assert) {
|
|
IOT_ASSERT(0);
|
|
}
|
|
}
|
|
|
|
return wmac_fsm;
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_set_sched_stop_done(uint32_t times)
|
|
{
|
|
/* NOTE: make sure CFG_RF_MAC_TXRX_CTL_ADDR is atomic operations,
|
|
* we need stop bbcpu irq.
|
|
*/
|
|
/* disable irq */
|
|
bb_cpu_mac_isr_stop();
|
|
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_TXRX_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_EARLY_STOP_DONE, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_TXRX_CTL_ADDR, tmp);
|
|
|
|
/* enable irq */
|
|
bb_cpu_mac_isr_start();
|
|
|
|
/* wmac fsm check */
|
|
return bb_cpu_mac_check_fsm(BB_CPU_CHECK_WMAC_FSM_DUE_TO_EARLY_STOP,
|
|
(times > 1));
|
|
}
|
|
|
|
void bb_cpu_mac_set_csma_is_ready()
|
|
{
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_PKT_INTERVAL_TIME_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_CSMA_CPU2_READY, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_PKT_INTERVAL_TIME_CTL_ADDR, tmp);
|
|
}
|
|
|
|
void bb_cpu_mac_set_cmdlist_done()
|
|
{
|
|
/* rf mac cmdlist done */
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_PKT_INTERVAL_TIME_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_CMDLIST_EARLY_STOP_DONE, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_PKT_INTERVAL_TIME_CTL_ADDR, tmp);
|
|
|
|
/* wmac cmdlist done */
|
|
tmp = WMAC_READ_REG(CFG_WMAC_CTRL_ADDR);
|
|
REG_FIELD_SET(SW_CMDLIST_DONE_CPU2_IDLE_PLS, tmp, 1);
|
|
WMAC_WRITE_REG(CFG_WMAC_CTRL_ADDR, tmp);
|
|
|
|
/* check wmac fsm */
|
|
bb_cpu_mac_check_fsm(BB_CPU_CHECK_WMAC_FSM_DUE_TO_CMDLIST_DONE, 1);
|
|
}
|
|
|
|
void bb_cpu_mac_tx_timer_en(uint32_t enable)
|
|
{
|
|
/* start rf mac tx timer */
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_BB_TX_TIMER_EN, tmp, enable);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR, tmp);
|
|
}
|
|
|
|
void bb_cpu_mac_stop_listen_timer_en(uint32_t enable)
|
|
{
|
|
/* start rf mac stop listen timer */
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_BB_EVT4_TIMER_EN, tmp, enable);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR, tmp);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_trigger_tx(uint32_t *phr)
|
|
{
|
|
uint32_t tmp, is_beacon = 0, recorc_ntb, tmp_ntb, tx_gap;
|
|
|
|
/* start bb tx timer every time */
|
|
bb_rf_tx_timer_en(1);
|
|
|
|
/* start rf mac tx timer */
|
|
bb_cpu_mac_tx_timer_en(1);
|
|
|
|
/* set tx rf timer, unit ntb */
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_TX_RF_TIMER_VALUE_ADDR, BB_CPU_AOTX_TIME);
|
|
/* tx bb time - tx rf time > 50us */
|
|
/* set tx bb timer, unit ntb */
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_TX_BB_TIMER_VALUE_ADDR, BB_CPU_SOTX_TIME);
|
|
|
|
/* start rf mac stop listen timer */
|
|
bb_cpu_mac_stop_listen_timer_en(1);
|
|
/* set evt bit4 timer, unit ntb */
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_EVT4_TIMER_VALUE_ADDR,
|
|
BB_CPU_NOTX_TIME);
|
|
|
|
if (phr) {
|
|
bb_cpu_rf_fc_t fc_msg = {0};
|
|
bb_cpu_mac_get_msg_from_phr(bb_cpu_get_proto(), phr, &fc_msg);
|
|
is_beacon = (fc_msg.delimiter == FC_DELIM_BEACON);
|
|
if (is_beacon) {
|
|
/* disable irq */
|
|
bb_cpu_mac_isr_stop();
|
|
}
|
|
}
|
|
|
|
/* record rx stop ntb */
|
|
recorc_ntb = bb_cpu_mac_get_stop_rx_evt_ntb();
|
|
|
|
/* start tx */
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_BB_EVT_BIT4, tmp, 1);
|
|
REG_FIELD_SET(RF_MAC_BB_EVT_BIT01, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR, tmp);
|
|
|
|
/* make sure rx stop has triggered */
|
|
do {
|
|
tmp_ntb = bb_cpu_mac_get_stop_rx_evt_ntb();
|
|
} while (recorc_ntb == tmp_ntb);
|
|
|
|
/* config beacon timestamp */
|
|
tx_gap = bb_cpu_get_tx_golden_gap(mac_rf_get_option());
|
|
if (phr && is_beacon) {
|
|
/* update timestamp */
|
|
switch (bb_cpu_get_proto()) {
|
|
#if SUPPORT_SMART_GRID
|
|
case PLC_PROTO_TYPE_SG:
|
|
{
|
|
frame_control_t *phr_t = (frame_control_t *)phr;
|
|
phr_t->vf.rf_bcn.time_stamp = tx_gap + tmp_ntb;
|
|
break;
|
|
}
|
|
#endif
|
|
#if SUPPORT_SOUTHERN_POWER_GRID
|
|
case PLC_PROTO_TYPE_SPG:
|
|
{
|
|
spg_frame_control_t *phr_t = (spg_frame_control_t *)phr;
|
|
phr_t->vf.rf_bcn.time_stamp = tx_gap + tmp_ntb;
|
|
break;
|
|
}
|
|
#endif
|
|
default:
|
|
IOT_ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
/* set phr */
|
|
bb_rf_set_tx_phr((uint32_t *)phr);
|
|
/* enable irq */
|
|
bb_cpu_mac_isr_start();
|
|
}
|
|
return tx_gap + tmp_ntb;
|
|
}
|
|
|
|
void bb_cpu_mac_rx_timer_en(uint32_t enable)
|
|
{
|
|
/* start rf mac rx timer */
|
|
uint32_t tmp = RF_MAC_READ_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_BB_RX_TIMER_EN, tmp, enable);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR, tmp);
|
|
}
|
|
|
|
void bb_cpu_mac_trigger_rx()
|
|
{
|
|
uint32_t tmp;
|
|
|
|
/* start bb rx timer every time */
|
|
bb_rf_rx_timer_en(1);
|
|
|
|
/* start rf mac rx timer */
|
|
bb_cpu_mac_rx_timer_en(1);
|
|
|
|
/* set tx rf timer, unit ntb */
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_RX_RF_TIMER_VALUE_ADDR, 2);
|
|
/* tx bb time - tx rf time > 50us */
|
|
/* set tx bb timer, unit ntb */
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_RX_BB_TIMER_VALUE_ADDR, (51 * 25));
|
|
|
|
/* start rx */
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_BB_EVT_BIT23, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR, tmp);
|
|
}
|
|
|
|
void bb_cpu_mac_trigger_stop_listen()
|
|
{
|
|
uint32_t tmp;
|
|
|
|
/* start bb stop listen timer every time */
|
|
bb_rf_stop_listen_timer_en(1);
|
|
|
|
/* start rf mac stop listen timer */
|
|
bb_cpu_mac_stop_listen_timer_en(1);
|
|
|
|
/* set evt bit4 timer, unit ntb */
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_EVT4_TIMER_VALUE_ADDR, 2);
|
|
|
|
/* stop listen */
|
|
tmp = RF_MAC_READ_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR);
|
|
REG_FIELD_SET(RF_MAC_BB_EVT_BIT4, tmp, 1);
|
|
RF_MAC_WRITE_REG(CFG_RF_MAC_BB_EVT_CTL_ADDR, tmp);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_tx_complete_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_NTB_TMR_0_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_tx_complete_local_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_LOCAL_TMR_0_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_stop_listen_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_NTB_TMR_1_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_stop_listen_local_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_LOCAL_TMR_1_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_stf_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_NTB_TMR_2_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_stf_local_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_LOCAL_TMR_2_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_sig_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_NTB_TMR_3_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_sig_local_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_LOCAL_TMR_3_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_phr_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_NTB_TMR_4_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_phr_local_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_LOCAL_TMR_4_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_pld_start_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_NTB_TMR_5_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rx_pld_start_local_ntb()
|
|
{
|
|
return RF_MAC_READ_REG(CFG_RF_MAC_BB_DEBUG_LOCAL_TMR_5_REG_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rf_tx_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_0_NTB_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_bb_tx_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_1_NTB_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rf_rx_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_2_NTB_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_bb_rx_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_3_NTB_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_stop_rx_evt_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_4_NTB_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rf_tx_local_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_0_LOCAL_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_bb_tx_local_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_1_LOCAL_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_rf_rx_local_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_2_LOCAL_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_bb_rx_local_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_3_LOCAL_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_stop_rx_evt_local_ntb()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_EVT_I_4_LOCAL_TMR_STS_ADDR);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_hwq_cur_ptr(uint32_t hwqid)
|
|
{
|
|
uint32_t cur_ptr_dlt = CFG_WMAC_WMAC_CURRENT_TX_PTR1_ADDR -
|
|
CFG_WMAC_WMAC_CURRENT_TX_PTR0_ADDR;
|
|
|
|
return WMAC_READ_REG(CFG_WMAC_WMAC_CURRENT_TX_PTR0_ADDR +
|
|
hwqid * cur_ptr_dlt);
|
|
}
|
|
|
|
uint32_t bb_cpu_mac_get_hwqfsm()
|
|
{
|
|
return WMAC_READ_REG(CFG_WMAC_TXQ_FSM_STS_ADDR);
|
|
}
|
|
|
|
void bb_cpu_dma_start(uint32_t bb_addr, uint32_t pb_addr, uint32_t byte_size)
|
|
{
|
|
(void)bb_addr;
|
|
(void)pb_addr;
|
|
(void)byte_size;
|
|
}
|
|
|
|
void bb_cpu_dma_stop()
|
|
{
|
|
}
|
|
|
|
void bb_cpu_mac_init(void)
|
|
{
|
|
bb_cpu_hw_ring_init();
|
|
bb_cpu_mac_isr_init();
|
|
bb_cpu_mac_isr_enable();
|
|
bb_cpu_timer_enable();
|
|
bb_cpu_mac_isr_start();
|
|
}
|
|
|
|
void bb_cpu_mac_get_msg_from_phr(uint32_t proto, void *phr, bb_cpu_rf_fc_t *msg)
|
|
{
|
|
switch (proto) {
|
|
#if SUPPORT_SMART_GRID
|
|
case PLC_PROTO_TYPE_SG:
|
|
{
|
|
/* nid share the same place for SG */
|
|
frame_control_t *sg_phr = (frame_control_t *)phr;
|
|
msg->nid = sg_phr->nid;
|
|
msg->delimiter = sg_phr->delimiter_type;
|
|
switch (sg_phr->delimiter_type) {
|
|
case FC_DELIM_BEACON:
|
|
{
|
|
msg->rf_mcs = (uint8_t)sg_phr->vf.rf_bcn.mcs;
|
|
msg->rf_pb_sz_idx = (uint8_t)sg_phr->vf.rf_bcn.pb_sz_idx;
|
|
msg->src_tei = sg_phr->vf.rf_bcn.src_tei;
|
|
break;
|
|
}
|
|
case FC_DELIM_SOF:
|
|
{
|
|
msg->dst_tei = sg_phr->vf.rf_sof.dst_tei;
|
|
msg->src_tei = sg_phr->vf.rf_sof.src_tei;
|
|
msg->rf_pb_sz_idx = (uint8_t)sg_phr->vf.rf_sof.pb_sz_idx;
|
|
msg->rf_mcs = (uint8_t)sg_phr->vf.rf_sof.mcs;
|
|
break;
|
|
}
|
|
case FC_DELIM_SACK:
|
|
{
|
|
msg->result_in_sack = sg_phr->vf.rf_sack.rx_result;
|
|
msg->dst_tei = sg_phr->vf.rf_sack.dtei;
|
|
msg->src_tei = sg_phr->vf.rf_sack.stei;
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
#if SUPPORT_SOUTHERN_POWER_GRID
|
|
case PLC_PROTO_TYPE_SPG:
|
|
{
|
|
spg_frame_control_t *spg_phr = (spg_frame_control_t *)phr;
|
|
msg->nid = spg_phr->snid;
|
|
msg->delimiter = spg_phr->delimiter_type;
|
|
switch (spg_phr->delimiter_type) {
|
|
case FC_DELIM_BEACON:
|
|
{
|
|
msg->rf_mcs = (uint8_t)spg_phr->vf.rf_bcn.mcs;
|
|
msg->rf_pb_sz_idx = (uint8_t)spg_phr->vf.rf_bcn.pb_sz_idx;
|
|
msg->src_tei = spg_phr->vf.rf_bcn.src_tei;
|
|
break;
|
|
}
|
|
case FC_DELIM_SOF:
|
|
{
|
|
msg->dst_tei = spg_phr->vf.rf_sof.dst_tei;
|
|
msg->src_tei = spg_phr->vf.rf_sof.src_tei;
|
|
msg->rf_pb_sz_idx = (uint8_t)spg_phr->vf.rf_sof.pb_sz_idx;
|
|
msg->rf_mcs = (uint8_t)spg_phr->vf.rf_sof.mcs;
|
|
break;
|
|
}
|
|
case FC_DELIM_SACK:
|
|
{
|
|
msg->result_in_sack = spg_phr->vf.rf_sack.rx_result;
|
|
msg->dst_tei = spg_phr->vf.rf_sack.dtei;
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
#endif
|
|
default:
|
|
(void)proto;
|
|
(void)phr;
|
|
(void)msg;
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|