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