⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swvlantb.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    UINT32 u32Addr;


    // Convert index to SRAM acture address
    u32Addr = SWVLANTB_dwVidToSramAddr(u16Indx);
    
    // Write sram data, because we want to clear [127]
    au8EntryBuf[15] = 0;
    // write entry
    if (!SWSRAM_bWriteEntry(u32Addr, au8EntryBuf))
        return FALSE;
    return TRUE;
}


BOOL SWVLANTB_bIsEntryInvalid(UINT16 u16Indx)
{
    UINT8   au8EntryBuf[VLAN_ENTRY_SIZE];
    UINT32 u32Addr;


    // Convert index to SRAM acture address
    u32Addr = SWVLANTB_dwVidToSramAddr(u16Indx);

    // read entry
    SWSRAM_bReadEntry(u32Addr, au8EntryBuf);

    // Check if bit[127] is not 0
    if ((au8EntryBuf[15] & VLAN_BPTN_VALID_VLAN) != 0)
        return FALSE;

    return TRUE;
}


void SWVLANTB_vSetIngrsFilter(UINT8 u8PortId, UINT8 u8Cfg)
{
    SWREG_vWriteU8(PORTCFG_INGRS_FLTR_BASE + (u8PortId * PORTCFG_PORT_OFFSET), sg_au8IngrsFilterPtn[u8Cfg]);
}


void SWVLANTB_vPortBaseClearAllGrp(void)
{
    UINT    uu;


    // Clear group of each port
    for (uu = 0; uu < SWITCH_PORT_NUM; uu++)
        SWVLANTB_bDelEntry( PORTBASE_ID_TO_VID(uu) );

    // Clear unused group
    SWVLANTB_bDelEntry( PORTBASE_VLAN_UNSET_GRP_VID );
}


void SWVLANTB_vPortBaseAddGrp (UINT32 u32MbrMsk)
{
    SVlanEntry  SEntryBuf;
    UINT32      u32ShftBuf = 0x00000001;
    UINT8       u8PortId;


    STR_pvMemset(&SEntryBuf, 0, sizeof(SVlanEntry));
    
    // Set vlan group of each member port
    for (u8PortId = 0; u8PortId < SWITCH_PORT_NUM; u8PortId++) {

        // Update members in current group
        if ((u32MbrMsk & u32ShftBuf) != 0) {
            // If entry not exist, insert one
            if (!SWVLANTB_bGetEntry( PORTBASE_ID_TO_VID(u8PortId), &SEntryBuf )) {
                SEntryBuf.u16Vid = PORTBASE_ID_TO_VID(u8PortId);
                SEntryBuf.u16Fid = PORTBASE_VLAN_FID;
                SEntryBuf.u32EgrsMbrPortMsk  = u32MbrMsk;
                SEntryBuf.u32IngrsMbrPortMsk = u32MbrMsk;
                SEntryBuf.u32TagPortMsk = 0;
            }
            // If entry exists, modify member
            else {
                SEntryBuf.u32EgrsMbrPortMsk  |= u32MbrMsk;
                SEntryBuf.u32IngrsMbrPortMsk |= u32MbrMsk;
            }
            // Update vlan table entry
            SWVLANTB_bSetEntry(&SEntryBuf);
        }
        u32ShftBuf <<= 1;
    }
}


void SWVLANTB_vPortBaseSetCfgForAllGrp (void)
{
    SVlanEntry  SEntryBuf;
    UINT32      u32MskBuf, u32EgrsMskBuf = 0, u32IngrsMskBuf = 0;
    UINT8       u8PortId;


    STR_pvMemset(&SEntryBuf, 0, sizeof(SVlanEntry));

    // Set PVID to each port and statistic existing member ports
    for (u8PortId = 0; u8PortId < SWITCH_PORT_NUM; u8PortId++) {
        SWVLANTB_vPvidSet( u8PortId, PORTBASE_ID_TO_VID(u8PortId) );
        if (SWVLANTB_bGetEntry( PORTBASE_ID_TO_VID(u8PortId), &SEntryBuf) ){
            u32EgrsMskBuf  |= SEntryBuf.u32EgrsMbrPortMsk;
            u32IngrsMskBuf |= SEntryBuf.u32IngrsMbrPortMsk;
        }
    }

    // Set unset-group from member port statistic result
    SEntryBuf.u16Vid = PORTBASE_VLAN_UNSET_GRP_VID;
    SEntryBuf.u16Fid = PORTBASE_VLAN_FID;
    SEntryBuf.u32EgrsMbrPortMsk  = ~u32EgrsMskBuf;
    SEntryBuf.u32IngrsMbrPortMsk = ~u32IngrsMskBuf;
    SEntryBuf.u32TagPortMsk = 0;
    SWVLANTB_bSetEntry(&SEntryBuf);

    // Set Pvid of unused ports
    u32MskBuf = 0x00000001;
    for (u8PortId = 0; u8PortId < SWITCH_PORT_NUM; u8PortId++) {
        if ((SEntryBuf.u32EgrsMbrPortMsk & u32MskBuf) != 0)
            SWVLANTB_vPvidSet(u8PortId, PORTBASE_VLAN_UNSET_GRP_VID);
        u32MskBuf <<= 1;
    }
}

//
// Output:  pu16Pvid: 0~4095 means refers to a 802.1Q VLAN, 4096~4223 means refer to an internal VLAN
//
void SWVLANTB_vPvidGet (UINT8 u8PortId, PUINT16 pu16Pvid)
{
	UINT16 u16Tmp;


    SWREG_vReadU16(PORTCFG_VLAN_CFG_BASE + (u8PortId * PORTCFG_PORT_OFFSET), &u16Tmp);
    *pu16Pvid = (u16Tmp & VLAN_CFG_INT_PVID_MSK);
}


//
// Input:  u16Pvid: 0~4095 means refers to a 802.1Q VLAN, 4096~4223 means refer to an internal VLAN
//
void SWVLANTB_vPvidSet (UINT8 u8PortId, UINT16 u16Pvid)
{
	UINT16 u16Tmp;


    SWREG_vReadU16(PORTCFG_VLAN_CFG_BASE + (u8PortId * PORTCFG_PORT_OFFSET), &u16Tmp);
    u16Tmp &= ~(VLAN_CFG_INT_PVID_MSK);
    u16Tmp |= u16Pvid;
    SWREG_vWriteU16(PORTCFG_VLAN_CFG_BASE + (u8PortId * PORTCFG_PORT_OFFSET), u16Tmp);
}


BOOL SWVLANTB_bIsIntEntryValid(UINT16 u16Vid)
{

	UINT8   u8Cfg, u8Offset;
		
    u8Offset = u16Vid - VID_NUM_8021Q;
    SWREG_vReadU8(FWDCTL_TBL_CFG, &u8Cfg);
    u8Cfg &= 0x3;
    
    if (u8Cfg == FWD_TBL_INTERNAL_VLAN_0)
        return FALSE;
    else if (u8Cfg == FWD_TBL_INTERNAL_VLAN_32){
        if (u8Offset >= 32)
            return FALSE;
    }
    else if (u8Cfg == FWD_TBL_INTERNAL_VLAN_64){
        if (u8Offset >= 64)
            return FALSE;
    }
    else{//128 entry
        if (u8Offset >= 128)
            return FALSE;
    }

    return TRUE;
}


UINT32 SWVLANTB_dwVidToSramAddr(UINT16 u16Vid)
{
    UINT32 dwAddr;
    
    
    if (u16Vid < VID_NUM_8021Q)
        dwAddr = SRAM_VLAN_TBL_BASE_ADDR + (u16Vid << SHIFT_NUM_SIZE_16Byte);
    else{
        // max vid number = 4096 + 128 =  4224; vid range is 0~4223
        if (u16Vid >= (INTER_VLAN_MAX_NUM + VID_NUM_8021Q))
            return UINT32_MAX;
        dwAddr = SRAM_PMAC_TBL_BASE_ADDR + ((u16Vid - VID_NUM_8021Q) << SHIFT_NUM_SIZE_16Byte);
    }
        
    return dwAddr;
}


UINT16 SWVLANTB_wSramAddrToVid(UINT32 u32SramAddr)
{
    UINT16 u16Vid;
    
    
    // is internal vid?
    if ((u32SramAddr >= SRAM_VLAN_TBL_BASE_ADDR) && (u32SramAddr < (SRAM_VLAN_TBL_BASE_ADDR+ SRAM_VLAN_TBL_SIZE) ))
        u16Vid = (u32SramAddr - SRAM_VLAN_TBL_BASE_ADDR) >> SHIFT_NUM_SIZE_16Byte;
    else if ((u32SramAddr >= SRAM_PMAC_TBL_BASE_ADDR) && (u32SramAddr < (SRAM_PMAC_TBL_BASE_ADDR+ INTER_VLAN_TBL_SIZE) ))
        u16Vid = ((u32SramAddr - SRAM_PMAC_TBL_BASE_ADDR) >> SHIFT_NUM_SIZE_16Byte) + VID_NUM_8021Q;
    else
        return UINT16_MAX;

    return u16Vid;
}


void SWVLANTB_vSetClassMethod(UINT16 u16Method)
{
    UINT8   uu;
    UINT16  u16VlanCfg;


    for (uu = 0; uu < SWITCH_PORT_NUM; uu++){
        SWREG_vReadU16(PORTCFG_VLAN_CFG_BASE + (uu * PORTCFG_PORT_OFFSET), &u16VlanCfg);
        u16VlanCfg &= ~(VLAN_CFG_CLASS_MSK);
        u16VlanCfg |= u16Method;
        SWREG_vWriteU16(PORTCFG_VLAN_CFG_BASE + (uu * PORTCFG_PORT_OFFSET), u16VlanCfg);
    }

}


void SWVLANTB_vSetVerbatimMode(UINT8 u8PortId, BOOL bEn)
{
    if (bEn)
        SWREG_vBitsOnU8(PORTCFG_VLAN_MODE_BASE + (u8PortId * PORTCFG_PORT_OFFSET), VLAN_CFG_VERBATIM_MODE);
    else
        SWREG_vBitsOffU8(PORTCFG_VLAN_MODE_BASE + (u8PortId * PORTCFG_PORT_OFFSET), VLAN_CFG_VERBATIM_MODE);

}


void SWVLANTB_vPvidSetPage (UINT8 u8PvidPageNo)
{
}


BOOL SWVLANTB_bIsPvidOutOfPage (UINT16 u16Pvid)
{
    return FALSE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -