193 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
Copyright(c) 2024 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 "os_types.h"
 | 
						|
#include "os_mem_api.h"
 | 
						|
#include "iot_irq.h"
 | 
						|
#include "hw_reg_api.h"
 | 
						|
#include "cpu.h"
 | 
						|
#include "sec_cpu_phy_isr.h"
 | 
						|
#include "phy_reg.h"
 | 
						|
#include "plc_mpdu_header.h"
 | 
						|
#include "iot_crypto_share.h"
 | 
						|
#include "sec_cpu_utils.h"
 | 
						|
#include "mac_sys_reg.h"
 | 
						|
#include "phy_bb.h"
 | 
						|
#include "phy_isr.h"
 | 
						|
#include "phy_phase.h"
 | 
						|
 | 
						|
phy_cpu_share_ctxt_t g_phy_cpu_share_ctxt;
 | 
						|
static iot_irq_t phy_irq_int_0;
 | 
						|
 | 
						|
void sec_cpu_get_rx_frm_msg_from_fc(void *fc, rx_fc_msg_t *msg)
 | 
						|
{
 | 
						|
    /* used for spg */
 | 
						|
    spg_frame_control_t *spg_fc = (spg_frame_control_t *)fc;
 | 
						|
    uint8_t delimiter = spg_fc->delimiter_type;
 | 
						|
 | 
						|
    msg->delimiter = delimiter;
 | 
						|
    if (delimiter == FC_DELIM_BEACON) {
 | 
						|
        msg->tmi = spg_fc->vf.bcn.tmi;
 | 
						|
        msg->numsym = spg_fc->vf.bcn.sym_num;
 | 
						|
    } else if (delimiter == FC_DELIM_SOF) {
 | 
						|
        msg->tmi = spg_fc->vf.sof.tmi;
 | 
						|
        msg->tmi_ext = spg_fc->vf.sof.tmi_ext;
 | 
						|
        msg->pb_num = (uint8_t)spg_fc->vf.sof.pb_num;
 | 
						|
        msg->numsym = spg_fc->vf.sof.sym_num;
 | 
						|
    } else {
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /* TODO used for sg */
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t sec_cpu_get_phy_interrupt_type(void)
 | 
						|
{
 | 
						|
    return PHY_READ_REG(CFG_BB_INT_MASK_0_ADDR);
 | 
						|
}
 | 
						|
 | 
						|
void sec_cpu_disable_phy_interrupt(uint32_t irq_type)
 | 
						|
{
 | 
						|
    uint32_t reg_int = PHY_READ_REG(CFG_BB_INT_EN_0_ADDR);
 | 
						|
 | 
						|
    reg_int &= (~irq_type);
 | 
						|
    PHY_WRITE_REG(CFG_BB_INT_EN_0_ADDR, reg_int);
 | 
						|
}
 | 
						|
 | 
						|
void sec_cpu_clear_phy_interrupt(uint32_t irq_type)
 | 
						|
{
 | 
						|
    PHY_WRITE_REG(CFG_BB_INT_CLR_0_ADDR, irq_type);
 | 
						|
}
 | 
						|
 | 
						|
void sec_cpu_enable_phy_interrupt(uint32_t irq_type)
 | 
						|
{
 | 
						|
    uint32_t reg_int = PHY_READ_REG(CFG_BB_INT_EN_0_ADDR);
 | 
						|
 | 
						|
    reg_int |= irq_type;
 | 
						|
    PHY_WRITE_REG(CFG_BB_INT_EN_0_ADDR, reg_int);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t sec_cpu_phy_isr_handler(uint32_t vector, iot_addrword_t data)
 | 
						|
{
 | 
						|
    (void)vector;
 | 
						|
    (void)data;
 | 
						|
    uint32_t isr_flag = sec_cpu_get_phy_interrupt_type();
 | 
						|
#if MAC_SYM_NUM_FIX
 | 
						|
    uint32_t bb_fc[4];
 | 
						|
    rx_fc_msg_t msg;
 | 
						|
#endif
 | 
						|
 | 
						|
    if (isr_flag & PHY_RECV_FD_CH_EST_DONE) {
 | 
						|
#if MAC_SYM_NUM_FIX
 | 
						|
        if (!g_phy_cpu_share_ctxt.sym_num_fix_dis) {
 | 
						|
            uint32_t tmp = RGF_MAC_READ_REG(CFG_RD_MACPHY_INTF_0_ADDR);
 | 
						|
            g_phy_cpu_share_ctxt.multiband = REG_FIELD_GET(PHY_RX_BANDSEL, tmp);
 | 
						|
        }
 | 
						|
#endif
 | 
						|
    }
 | 
						|
 | 
						|
    if (isr_flag & PHY_RECV_FD_FC_OK) {
 | 
						|
        g_phy_cpu_share_ctxt.reg_phase = phy_get_mac_rx_phase();
 | 
						|
#if MAC_SYM_NUM_FIX
 | 
						|
        if (!g_phy_cpu_share_ctxt.sym_num_fix_dis) {
 | 
						|
            bb_fc[0] = PHY_READ_REG(CFG_BB_RX_FC_RAW_0_ADDR);
 | 
						|
            bb_fc[1] = PHY_READ_REG(CFG_BB_RX_FC_RAW_1_ADDR);
 | 
						|
            bb_fc[2] = PHY_READ_REG(CFG_BB_RX_FC_RAW_2_ADDR);
 | 
						|
            bb_fc[3] = PHY_READ_REG(CFG_BB_RX_FC_RAW_3_ADDR);
 | 
						|
 | 
						|
            sec_cpu_get_rx_frm_msg_from_fc(bb_fc, &msg);
 | 
						|
 | 
						|
            if (((msg.delimiter == FC_DELIM_SOF) ||
 | 
						|
                (msg.delimiter == FC_DELIM_BEACON))) {
 | 
						|
                uint16_t total_sym_num, sym_num;
 | 
						|
                uint16_t *p_symppb =
 | 
						|
                    (uint16_t *)g_phy_cpu_share_ctxt.p_g_symppb;
 | 
						|
                uint8_t tmi = msg.tmi;
 | 
						|
 | 
						|
                if (msg.delimiter == FC_DELIM_SOF) {
 | 
						|
                    tmi += msg.tmi_ext;
 | 
						|
                }
 | 
						|
                sym_num = *(p_symppb + g_phy_cpu_share_ctxt.multiband *
 | 
						|
                    SG_OFDM_MAX + tmi);
 | 
						|
                if (sym_num != msg.numsym) {
 | 
						|
                    if (msg.delimiter == FC_DELIM_SOF) {
 | 
						|
                        total_sym_num = sym_num * msg.pb_num;
 | 
						|
                    } else {
 | 
						|
                        total_sym_num = sym_num;
 | 
						|
                    }
 | 
						|
                    uint32_t tmp =
 | 
						|
                        PHY_READ_REG(CFG_BB_CONFIG_FC_PARSE_0_ADDR);
 | 
						|
                    REG_FIELD_SET(SW_CONFIG_PB_SYMB_NUM, tmp, sym_num);
 | 
						|
                    REG_FIELD_SET(SW_CONFIG_PLD_SYMB_NUM, tmp,
 | 
						|
                        total_sym_num);
 | 
						|
                    REG_FIELD_SET(SW_CONFIG_PB_SYMB_NUM_EN, tmp, 1);
 | 
						|
                    REG_FIELD_SET(SW_CONFIG_PLD_SYMB_NUM_EN, tmp, 1);
 | 
						|
                    PHY_WRITE_REG(CFG_BB_CONFIG_FC_PARSE_0_ADDR, tmp);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
#endif
 | 
						|
    }
 | 
						|
 | 
						|
    if (isr_flag & PHY_RECV_FD_PLD_OK ||
 | 
						|
        isr_flag & PHY_RECV_FD_PLD_FAIL) {
 | 
						|
#if MAC_SYM_NUM_FIX
 | 
						|
        uint32_t tmp = PHY_READ_REG(CFG_BB_CONFIG_FC_PARSE_0_ADDR);
 | 
						|
        if (REG_FIELD_GET(SW_CONFIG_PB_SYMB_NUM_EN, tmp) ||
 | 
						|
            REG_FIELD_GET(SW_CONFIG_PLD_SYMB_NUM_EN, tmp)) {
 | 
						|
            REG_FIELD_SET(SW_CONFIG_PB_SYMB_NUM_EN, tmp, 0);
 | 
						|
            REG_FIELD_SET(SW_CONFIG_PLD_SYMB_NUM_EN, tmp, 0);
 | 
						|
            PHY_WRITE_REG(CFG_BB_CONFIG_FC_PARSE_0_ADDR, tmp);
 | 
						|
        }
 | 
						|
#endif
 | 
						|
#if MAC_TIMESTAMPING
 | 
						|
        /* PLD ok or fail interrupt */
 | 
						|
        g_phy_cpu_share_ctxt.phy_pld_int_ntb =
 | 
						|
            RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
 | 
						|
#endif
 | 
						|
    }
 | 
						|
 | 
						|
    sec_cpu_clear_phy_interrupt(isr_flag);
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void sec_cpu_phy_isr_start(void)
 | 
						|
{
 | 
						|
    iot_interrupt_unmask(phy_irq_int_0);
 | 
						|
}
 | 
						|
 | 
						|
void sec_cpu_phy_isr_stop(void)
 | 
						|
{
 | 
						|
    iot_interrupt_mask(phy_irq_int_0);
 | 
						|
}
 | 
						|
 | 
						|
void sec_cpu_phy_isr_init(void)
 | 
						|
{
 | 
						|
    uint32_t cpu_id = cpu_get_mhartid();
 | 
						|
 | 
						|
    phy_irq_int_0 = iot_interrupt_create(HAL_VECTOR_PHY_0, HAL_INTR_PRI_6,
 | 
						|
        0, sec_cpu_phy_isr_handler);
 | 
						|
 | 
						|
    iot_interrupt_set_cpu(phy_irq_int_0, cpu_id);
 | 
						|
 | 
						|
    iot_interrupt_attach(phy_irq_int_0);
 | 
						|
 | 
						|
    /* start intc */
 | 
						|
    sec_cpu_phy_isr_start();
 | 
						|
}
 | 
						|
 |