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();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |