Files
kunlun/plc/halmac/hw2/rawdata/mac_rawdata_hw.c
2024-09-28 14:24:04 +08:00

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 */