289 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| 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.
 | |
| 
 | |
| ****************************************************************************/
 | |
| #include "mac_rawdata_hw.h"
 | |
| #include "hw_reg_api.h"
 | |
| #include "phy_reg.h"
 | |
| #include "iot_errno.h"
 | |
| #include "mac_tx_hw.h"
 | |
| #include "os_types.h"
 | |
| 
 | |
| #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | |
| #include "mac_raw_reg.h"
 | |
| #include "mac_sched_hw.h"
 | |
| #include "phy_bb.h"
 | |
| #include "plc_mpdu_header.h"
 | |
| #include "mac_sys_reg.h"
 | |
| #include "hw_reg_api.h"
 | |
| 
 | |
| void IRAM_ATTR iot_raw_write_reg(uint32_t type, uint32_t addr, uint32_t val)
 | |
| {
 | |
| 
 | |
|     if(type == RAW_REG_TYPE_MAC){
 | |
|         RGF_RAW_WRITE_REG(addr,val);
 | |
|     }else if(type == RAW_REG_TYPE_PHY){
 | |
|         PHY_WRITE_REG(addr, val);
 | |
|     }
 | |
| }
 | |
| 
 | |
| uint32_t IRAM_ATTR iot_raw_read_reg(uint32_t type,  uint32_t addr)
 | |
| {
 | |
|     uint32_t val = 0;
 | |
|     if(type == RAW_REG_TYPE_MAC){
 | |
|         val = RGF_RAW_READ_REG(addr);
 | |
|     }else if(type == RAW_REG_TYPE_PHY){
 | |
|         val = PHY_READ_REG(addr);
 | |
|     }
 | |
| 
 | |
|     return val;
 | |
| }
 | |
| 
 | |
| void mac_rawdata_mode_enable(uint32_t enable)
 | |
| {
 | |
|     /* set mac raw mode */
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, CFG_RAW_DATA_MODE_ADDR, enable);
 | |
| }
 | |
| 
 | |
| void phy_rawdata_mode_enable(uint32_t enable)
 | |
| {
 | |
|     /* set bb raw mode */
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_PHY,CFG_BB_RAW_DATA_MODE_CTRL_ADDR, \
 | |
|         enable);
 | |
| }
 | |
| 
 | |
| void mac_rawdata_proto_set(uint32_t src_prot)
 | |
| {
 | |
|     /* set mac raw mode proto */
 | |
|     src_prot &= CFG_SW_TX_PROTO_MASK;
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, CFG_SW_TX_PROTO_ADDR, src_prot);
 | |
| }
 | |
| 
 | |
| uint32_t iot_rawdata_hw_enable(uint8_t rawdata_enable)
 | |
| {
 | |
|     /* set mac raw mode */
 | |
|     mac_rawdata_mode_enable(rawdata_enable);
 | |
| 
 | |
|     /* set bb raw mode */
 | |
|     phy_rawdata_mode_enable(rawdata_enable);
 | |
| 
 | |
|     return ERR_OK;
 | |
| }
 | |
| 
 | |
| uint32_t iot_rawdata_get_tx_fc_bytes(fc_trans_msg *rawfc)
 | |
| {
 | |
|     uint32_t idx=0;
 | |
| #ifdef ENABLE_PRINT
 | |
|     iot_printf("get_mac_tx_fc\n");
 | |
| #endif
 | |
|     rawfc->org_fc[idx++]= iot_raw_read_reg(RAW_REG_TYPE_MAC,CFG_TX_RAW_FC_0_ADDR);
 | |
|     rawfc->org_fc[idx++]= iot_raw_read_reg(RAW_REG_TYPE_MAC,CFG_TX_RAW_FC_1_ADDR);
 | |
|     rawfc->org_fc[idx++]= iot_raw_read_reg(RAW_REG_TYPE_MAC,CFG_TX_RAW_FC_2_ADDR);
 | |
|     rawfc->org_fc[idx++]= iot_raw_read_reg(RAW_REG_TYPE_MAC,CFG_TX_RAW_FC_3_ADDR);
 | |
| 
 | |
|     return ERR_OK;
 | |
| }
 | |
| 
 | |
| uint32_t iot_rawdata_translate_tx_fc(fc_trans_msg *rawfc, \
 | |
|     uint32_t src_prot, uint32_t trans_prot)
 | |
| {
 | |
|     /*
 | |
|      * consider two cases. 1. src_prot and trans_prot are same, but minor
 | |
|      * version different.  2. src_prot and trans_prot are different.
 | |
|      * 2nd case should not to hit, focus on case 1 currently.
 | |
|     */
 | |
|     frame_control_t* src_sgfc = NULL;
 | |
|     frame_control_t* trans_sgfc = NULL;
 | |
| 
 | |
|     spg_frame_control_t* src_spgfc = NULL;
 | |
|     spg_frame_control_t* trans_spgfc = NULL;
 | |
| 
 | |
|     if(src_prot == trans_prot){
 | |
|         if(src_prot == PLC_PROTO_TYPE_SG){
 | |
|             src_sgfc = (frame_control_t*)rawfc->org_fc;
 | |
|             trans_sgfc = (frame_control_t*)rawfc->trans_fc;
 | |
| 
 | |
|             /* real work should be bits adjustment in same prot family
 | |
|              * currently just copy
 | |
|             */
 | |
|            os_mem_cpy(trans_sgfc,src_sgfc,(RAW_FC_LEN_DW*sizeof(uint32_t)) );
 | |
| 
 | |
|         }else if (src_prot == PLC_PROTO_TYPE_SPG){
 | |
|             src_spgfc = (spg_frame_control_t*)rawfc->org_fc;
 | |
|             trans_spgfc = (spg_frame_control_t*)rawfc->trans_fc;
 | |
| 
 | |
|             /* real work should be bits adjustment in same prot family
 | |
|              * currently just copy
 | |
|             */
 | |
|             os_mem_cpy(trans_spgfc, src_spgfc,(RAW_FC_LEN_DW*sizeof(uint32_t)));
 | |
|         }else{
 | |
|             IOT_ASSERT(0);
 | |
|         }
 | |
| 
 | |
|     }else{
 | |
|         IOT_ASSERT(0);
 | |
|     }
 | |
| 
 | |
|     return ERR_OK;
 | |
| }
 | |
| 
 | |
| 
 | |
| uint32_t iot_rawdata_set_translate_tx_fc(fc_trans_msg *rawfc)
 | |
| {
 | |
|     uint32_t idx = 0;
 | |
| #ifdef ENABLE_PRINT
 | |
|     iot_printf("set_mac_tx_fc\n");
 | |
| #endif
 | |
|     /* caculate crc data here */
 | |
| //       iot_rawdata_set_crc(rawfc);
 | |
| 
 | |
|     /* Set Data */
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC,CFG_TX_SW_FC_0_ADDR,rawfc->trans_fc[idx++]);
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC,CFG_TX_SW_FC_1_ADDR,rawfc->trans_fc[idx++]);
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC,CFG_TX_SW_FC_2_ADDR,rawfc->trans_fc[idx++]);
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC,CFG_TX_SW_FC_3_ADDR,rawfc->trans_fc[idx++]);
 | |
| 
 | |
|     //iot_rawdata_modify_tx_fc(rawfc);
 | |
| 
 | |
|     /* Valid data */
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC,CFG_SW_FC_VALID_ADDR, 1);
 | |
| 
 | |
| #ifdef RAWDATA_TIME_PROFILE_ENABLE
 | |
|     /* log interrupt trigger time */
 | |
|     iot_rawdata_mark_timestamp(&rawfc->profile.rawdata_set_translate_fc_ticks);
 | |
| #endif
 | |
| 
 | |
|     return ERR_OK;
 | |
| }
 | |
| 
 | |
| void  mac_rawdata_sack_tx_isr_disable()
 | |
| {
 | |
|     uint32_t reg_intr_en = 0;
 | |
| 
 | |
|     /* handle mac intr */
 | |
|     reg_intr_en = iot_raw_read_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_ENA_ADDR);
 | |
|     reg_intr_en &= (~MAC_TX_SACK_FC_MASK);
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_ENA_ADDR, reg_intr_en);
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| void mac_rawdata_sack_tx_isr_enable()
 | |
| {
 | |
|     uint32_t reg_intr_en = 0;
 | |
|     uint32_t reg_int = 0;
 | |
| 
 | |
|     reg_int = iot_raw_read_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_PRI3_MASK_ADDR);
 | |
|     reg_int |= MAC_TX_SACK_FC_MASK;
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_PRI3_MASK_ADDR, reg_int);
 | |
| 
 | |
|     reg_intr_en = iot_raw_read_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_ENA_ADDR);
 | |
|     reg_intr_en |= MAC_TX_SACK_FC_MASK;
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_ENA_ADDR, reg_intr_en);
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| void mac_rawdata_sack_isr_cfg(uint32_t src_prot)
 | |
| {
 | |
|     /* disable sack tx rawdata isr */
 | |
|     mac_rawdata_sack_tx_isr_disable();
 | |
|     /* set rawdata mode */
 | |
|     mac_rawdata_proto_set(src_prot);
 | |
|     /* enable sack tx rawdata isr */
 | |
|     mac_rawdata_sack_tx_isr_enable();
 | |
| }
 | |
| 
 | |
| void mac_rawdata_tx_start_isr_disable()
 | |
| {
 | |
|     uint32_t reg_intr_en = 0;
 | |
| 
 | |
|     /* handle mac intr */
 | |
|     reg_intr_en = iot_raw_read_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_ENA_ADDR);
 | |
|     reg_intr_en &= (~MAC_TX_START_MASK);
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_ENA_ADDR, reg_intr_en);
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| void mac_rawdata_tx_start_isr_enable()
 | |
| {
 | |
|     uint32_t reg_intr_en = 0;
 | |
|     uint32_t reg_int = 0;
 | |
| 
 | |
|     reg_int = iot_raw_read_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_PRI3_MASK_ADDR);
 | |
|     reg_int |= MAC_TX_START_MASK;
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_PRI3_MASK_ADDR, reg_int);
 | |
| 
 | |
|     reg_intr_en = iot_raw_read_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_ENA_ADDR);
 | |
|     reg_intr_en |= MAC_TX_START_MASK;
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, CFG_RAW_INT_ENA_ADDR, reg_intr_en);
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| void mac_rawdata_tx_war_isr_cfg(void)
 | |
| {
 | |
|     /* disable rawdata tx start isr */
 | |
|     mac_rawdata_tx_start_isr_disable();
 | |
| 
 | |
|     /* enable rawdata tx start isr */
 | |
|     mac_rawdata_tx_start_isr_enable();
 | |
| }
 | |
| 
 | |
| void IRAM_ATTR mac_rawdata_tx_start_isr_clr(void)
 | |
| {
 | |
|     uint32_t reg_intr_status = 0;
 | |
|     reg_intr_status = iot_raw_read_reg(RAW_REG_TYPE_MAC, \
 | |
|                             CFG_RAW_INT_CLR_ADDR);
 | |
|     reg_intr_status |= MAC_TX_START_INT_STATUS;
 | |
|     iot_raw_write_reg(RAW_REG_TYPE_MAC, \
 | |
|                             CFG_RAW_INT_CLR_ADDR, reg_intr_status);
 | |
| }
 | |
| 
 | |
| #else // HW_PLATFORM >= HW_PLATFORM_FPGA
 | |
| void mac_rawdata_sack_isr_cfg(uint32_t src_prot)
 | |
| {
 | |
|     (void)src_prot;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #if CPLC_IOT_CERT_SUPPORT
 | |
| 
 | |
| void mac_rawdata_send_cert_mpdu(uint32_t hwqid, tx_mpdu_start *mpdu,
 | |
|     fc_trans_msg *p_msg, void *fc, uint32_t tmi, uint32_t ext_tmi)
 | |
| {
 | |
|     (void)hwqid;
 | |
|     (void)mpdu;
 | |
|     (void)p_msg;
 | |
|     (void)fc;
 | |
|     (void)tmi;
 | |
|     (void)ext_tmi;
 | |
| }
 | |
| 
 | |
| #else /* CPLC_IOT_CERT_SUPPORT */
 | |
| 
 | |
| void mac_rawdata_send_cert_mpdu(uint32_t hwqid, tx_mpdu_start *mpdu,
 | |
|     fc_trans_msg *p_msg, void *fc, uint32_t tmi, uint32_t ext_tmi)
 | |
| {
 | |
|     (void)hwqid;
 | |
|     (void)mpdu;
 | |
|     (void)p_msg;
 | |
|     (void)fc;
 | |
|     (void)tmi;
 | |
|     (void)ext_tmi;
 | |
| }
 | |
| 
 | |
| #endif /* CPLC_IOT_CERT_SUPPORT */
 | |
| 
 |