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