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

📄 pisystem.c

📁 vt6528芯片交换机API函数和文档运行程序
💻 C
字号:
/*
 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
 * All rights reserved.
 *
 * This software is copyrighted by and is the sole property of
 * VIA Networking Technologies, Inc. This software may only be used
 * in accordance with the corresponding license agreement. Any unauthorized
 * use, duplication, transmission, distribution, or disclosure of this
 * software is expressly forbidden.
 *
 * This software is provided by VIA Networking Technologies, Inc. "as is"
 * and any express or implied warranties, including, but not limited to, the
 * implied warranties of merchantability and fitness for a particular purpose
 * are disclaimed. In no event shall VIA Networking Technologies, Inc.
 * be liable for any direct, indirect, incidental, special, exemplary, or
 * consequential damages.
 *
 *
 * File:    pisystem.c
 *
 * Purpose: System initialization/booting operations
 *
 * Author:  Tevin Chen
 *
 * Date:    Jan 08, 2002
 *
 * Functions:
 *
 * Revision History:
 *
 */


#if !defined(__PLATFORM_H__)
#include "platform.h"
#endif
#if !defined(__STR_H__)
#include "str.h"
#endif
#if !defined(__SOC_H__)
#include "soc.h"
#endif
#if !defined(__UART_H__)
#include "uart.h"
#endif
#if !defined(__TIMER_H__)
#include "timer.h"
#endif
#if !defined(__NVRAM_H__)
#include "nvram.h"
#endif
#include "tty.h"
#include "swmii.h"
#include "swsys.h"
#include "pieeprom.h"
#include "pigencfg.h"
#include "pimod.h"

#if !defined(__SWMODL_H__)
#include "swmodl.h"
#endif
#include "piport.h"
#include "piqos.h"
#include "pirate.h"
#include "swport.h"
#include "pisystem.h"

#ifdef __MODULE_WEB_SMART
#if !defined(__NETIF_H__)
#include "netif.h"
#endif
#include "piipcfg.h"
#include "swpkt.h"
#endif

#ifdef __PROV_MENU
#include "pistp.h"
#include "piipmmod.h"
#include "piprvmis.h"
#include "pi8021x.h"
#include "pigmrpmd.h"
#include "pismac.h"
#endif

#include "piaclgrp.h"

#include "pimacfltmd.h"


/*---------------------  Static Definitions  ------------------------*/
#define IRQ_TEST_LUCAS      1
#define AUTO_POLLING_WAIT   0x001FFFFF

/*---------------------  Static Types  ------------------------------*/

/*---------------------  Static Macros  -----------------------------*/

/*---------------------  Static Classes  ----------------------------*/

/*---------------------  Static Variables  --------------------------*/

/*---------------------  Static Functions  --------------------------*/
BOOL PISYS_bBoardDiag(void);

/*---------------------  Export Variables  --------------------------*/




void PISYS_vSetHwFromEep(UConfigBuf* pUCfgBuf)
{
    // init module cards
    PIMOD_vDetectModuleCard();

    // Setting trunk will update LogId list for port mapping
    PITRK_vSetHwFromEep((STrkPageCfg*)pUCfgBuf);

    PIPORT_vSetHwFromEep((SPortPageCfg*)pUCfgBuf);

    PIQOS_vSetHwFromEep((SQosPageCfg*)pUCfgBuf);

    PIRATE_vSetHwFromEep((SRatePageCfg*)pUCfgBuf);

    PIVLAN_vSetHwFromEep((SVlanPageCfg*)pUCfgBuf);
    PIVLNFLT_vSetHwFromEep((SVlanIngrFilterPageCfg*)pUCfgBuf);

    PIACL_vSetHwFromEep((SACLPageCfg *)pUCfgBuf);

    PIMISC_vSetHwFromEep((SMiscPageCfg*)pUCfgBuf);

    PISNF_vSetHwFromEep((SSniffPageCfg*)pUCfgBuf);

#ifdef __MODULE_WEB_SMART
    PIIPCONF_vSetHwFromEep();

    PIFWUPDT_vSetHwFromEep();
#endif

#ifdef __PROV_MENU

    PISTP_vSetHwFromEep((SSTPPageCfg*)pUCfgBuf);
    PIIGMP_vSetHwFromEep((SIGMPPageCfg*)pUCfgBuf);
    PI8021X_vSetHwFromEep((S8021XPageCfg*)pUCfgBuf);
    PISMAC_vSetHwFromEep((SSMacPageCfg*)pUCfgBuf);
    PIGMRP_vSetHwFromEep((SGMRPPageCfg*)pUCfgBuf);
    PIPROVMISC_vSetHwFromEep((SProvMiscPageCfg*)pUCfgBuf);

#endif

    PIMACFLT_vSetHwFromEep((SMacFltPageCfg *)pUCfgBuf);

}


void PISYS_vBoardWriteDefault(UConfigBuf* pUCfgBuf)
{
    // Clear nvram software cache
    STR_pvMemset(g_abyNVRSwCache, 0, NVR_SIZE_IPCONF + NVR_SIZE_FWUPDT + NVR_SW_CACHE_SIZE);

    PIEEP_vSetVerAndSig(TRUE);

    PIPORT_vSetEepDefault((SPortPageCfg*)pUCfgBuf, TRUE);

    PIQOS_vSetEepDefault((SQosPageCfg*)pUCfgBuf, TRUE);

    PIRATE_vSetEepDefault((SRatePageCfg*)pUCfgBuf, TRUE);

    PITRK_vSetEepDefault((STrkPageCfg*)pUCfgBuf, TRUE);

    PIVLAN_vSetEepDefault((SVlanPageCfg*)pUCfgBuf, TRUE);
    PIVLNFLT_vSetEepDefault((SVlanIngrFilterPageCfg*)pUCfgBuf, TRUE);

    PIACL_vSetEepDefault((SACLPageCfg*)pUCfgBuf, TRUE);

    PIMISC_vSetEepDefault((SMiscPageCfg*)pUCfgBuf, TRUE);

    PISNF_vSetEepDefault((SSniffPageCfg*)pUCfgBuf, TRUE);

    PIADM_vSetEepDefault(TRUE);

#ifdef __MODULE_WEB_SMART
    PIIPCONF_vSetEepDefault(TRUE);

    PIFWUPDT_vSetEepDefault(TRUE);
#endif

#ifdef __PROV_MENU

    PISTP_vSetEepDefault((SSTPPageCfg*)pUCfgBuf, TRUE);
    PIIGMP_vSetEepDefault((SIGMPPageCfg*)pUCfgBuf, TRUE);
    PI8021X_vSetEepDefault((S8021XPageCfg*) pUCfgBuf, TRUE);
    PISMAC_vSetEepDefault((SSMacPageCfg*) pUCfgBuf, TRUE);
    PIGMRP_vSetEepDefault((SGMRPPageCfg*) pUCfgBuf, TRUE);
    PIPROVMISC_vSetEepDefault((SProvMiscPageCfg*)pUCfgBuf, TRUE);

#endif
    PIMACFLT_vSetEepDefault((SMacFltPageCfg *)pUCfgBuf, TRUE);

    // write cache data into flash
    NVRAM_bWriteBlock(NVR_ADDR_IPCONF, g_abyNVRSwCache, (NVR_ADDR_DATA_AREA_START - NVR_ADDR_IPCONF) + EEP_SIZE_DATA_AREA, FALSE);
    NVRAM_vUpdateChecksum(EEP_SIZE_DATA_AREA);
    // write used data area size
    NVRAM_bWriteU32(NVR_ADDR_DATA_AREA_SIZE, (NVR_ADDR_DATA_AREA_START - NVR_ADDR_BASE) + EEP_SIZE_DATA_AREA);
}


void PISYS_vBoardBoot(void)
{
    UINT8   u8BaudRateMode;



    // init interrupt controller
    INTR_vInit();
    // CPU init misc setting
    SOC_vInit();
    // init timer, and hook ISR
    TMR_vInit();
    // init UART, and hook ISR
    UART_vInit();
    NVRAM_bReadU8(NVR_ADDR_UART_RATE_MODE, &u8BaudRateMode);
    UART_bSetBaudRate(u8BaudRateMode);

    // init target borad
    SWSYS_vBoardInit();
#ifdef __MODULE_WEB_SMART
    // Enable forwarding CPU packets.
    SWPKT_vDrvOpen();
#endif

    // Diagnose system
    while (!PISYS_bBoardDiag()) {
        TTY_vPutStr("\n\nThere may be some problems in your hardware.");
        TTY_vPutStr("\nPlease contact your manufacturer.");
        TTY_cGetChar();
    }

    // check eeprom checksum, version and signature
    TTY_vPutStr("\nEEPROM Content Check ...... ");
    if (!( PIEEP_bCheckVerAndSig() && NVRAM_bVerifyChecksum(EEP_SIZE_DATA_AREA) )) {
        TTY_vPutStr("FAIL");

        TTY_vPutStr("\n\nWriting default setting into EEPROM .. ");
        PISYS_vBoardWriteDefault(&g_UCfgBuf);
        TTY_vPutStr("OK");
    }
    else {
        TTY_vPutStr("PASS");
    }

    // Load eeprom config and set to hardware
    TTY_vPutStr("\n\nInitializing user configuration ... ");
    PISYS_vSetHwFromEep(&g_UCfgBuf);
    TTY_vPutStr("OK");

    INTR_vSwitchEnable();

/* //TOCHECK
    // Set giga 1 config from strapping
    if (SWPORT_bIsTbiPort(SWITCH_GIGA_PORT_ID_BASE))
        SWREG_vBitsOnU8(PHYCTL_MII_AUTOPOLL_CFG, MII_AUTOPOLL_GIGA0_TBI);

    // Set giga 2 config from strapping
    if (SWPORT_bIsTbiPort(SWITCH_GIGA_PORT_ID_BASE + 1))
        SWREG_vBitsOnU8(PHYCTL_MII_AUTOPOLL_CFG, MII_AUTOPOLL_GIGA1_TBI);
*/
}


BOOL PISYS_bBoardDiag(void)
{
    BOOL    bResult;
    UINT    uu;



    TTY_vPutStr("\n\nSystem Diagnosing:\n");

    TTY_vPutStr("\nSwitch Register R/W Test .. ");
    bResult = PISYS_bRegReadWriteTest();
    if (!bResult) {
        TTY_vPutStr("FAIL");
        return FALSE;
    }
    TTY_vPutStr("PASS");

    TTY_vPutStr("\nPhy Register R/W Test ..... ");
    for (uu = 0; uu < SWITCH_MEGA_PORT_NUM; uu++)
        bResult = bResult && PISYS_bMiiReadWriteTest(uu);
    if (!bResult) {
        TTY_vPutStr("FAIL");
        return FALSE;
    }
    TTY_vPutStr("PASS");

    return TRUE;
}


BOOL PISYS_bRegReadWriteTest(void)
{
    UINT8   byOrgVal;
    UINT8   byTmp;


    SWREG_vReadU8(FWDCTL_SWITCH_MAC_ADDR0 + 2, &byOrgVal);

    // Test pattern => 0x5A
    SWREG_vWriteU8(FWDCTL_SWITCH_MAC_ADDR0 + 2, 0x5A);
    SWREG_vReadU8(FWDCTL_SWITCH_MAC_ADDR0 + 2, &byTmp);
    if (byTmp != 0x5A)
        return FALSE;

    // restore to power-on default value
    SWREG_vWriteU8(FWDCTL_SWITCH_MAC_ADDR0 + 2, byOrgVal);

    return TRUE;
}


BOOL PISYS_bMiiReadWriteTest(UINT8 byPortId)
{
    UINT16  wOrgVal;
    UINT16  wTmp;

    
    // save original value
    SWMII_bReadU16(byPortId, MII_REG_ANAR, &wOrgVal);
    
    // Test pattern 1 => all tested bits are set to 1
    SWMII_bRegBitsOn(byPortId, MII_REG_ANAR, ANAR_ABL_MEGA);
    if (!SWMII_bIsRegBitsOn(byPortId, MII_REG_ANAR, ANAR_ABL_MEGA))
        return FALSE;

    // Test pattern 2 => all tested bits are set to 0
    SWMII_bRegBitsOff(byPortId, MII_REG_ANAR, ANAR_ABL_MEGA);
    if (!SWMII_bIsRegBitsOff(byPortId, MII_REG_ANAR, ANAR_ABL_MEGA))
        return FALSE;

    // restore to default value
    SWMII_bReadU16(byPortId, MII_REG_ANAR, &wTmp);
    wTmp &= (UINT16)~ANAR_ABL_MEGA;
    wOrgVal &= ANAR_ABL_MEGA;
    wTmp |= wOrgVal;
    SWMII_bWriteU16(byPortId, MII_REG_ANAR, wTmp);

    return TRUE;
}


BOOL PISYS_bNvramReadWriteTest(UINT32 u32EepBaseAddr)
{
    UINT8   byOrgVal, byTmp;
    BOOL    bResult = TRUE;


    // save original value
    NVRAM_bReadU8(u32EepBaseAddr,  &byOrgVal);

    // check result of test pattern
    NVRAM_bWriteU8(u32EepBaseAddr, 0x5A );
    NVRAM_bReadU8(u32EepBaseAddr, &byTmp);
    if (byTmp != 0x5A )
        bResult = FALSE;

    // restore to default value
    NVRAM_bWriteU8(u32EepBaseAddr, byOrgVal);
    return  bResult;
}


static void s_vAutoPollDelay(void)
{
    volatile UINT32     u32Delay;
    for (u32Delay = 0; u32Delay <= AUTO_POLLING_WAIT; u32Delay++)
    {
        
    }
    
}

BOOL PISYS_bIrqConnectTest(void)
{
    BOOL    bTestResult = TRUE;
    
    UINT32  dwIsrCnt;
    UINT32  ii;
    UINT16  wOrgSwitchIrq;


    // Backup irq status and open phy link status change irq only
    SWREG_vReadU16(CPUIF_IRQ_MASK, &wOrgSwitchIrq);
    SWREG_vWriteU16(CPUIF_IRQ_MASK, 0);

    // Keep original counter value of isr_lnkChg
    dwIsrCnt = g_SIsrCpuCntr.dwIsrLnkChg;

    // Clear link_change interrupt
    SWREG_vWriteU16(CPUIF_IRQ_STATUS, IRQ_STATUS_LINK_CHG);

#if (IRQ_TEST_LUCAS)
    {
        
        UINT8   byPhyCtrlReg;
        
        
        /*
         * Step 1, Initialize port state, make sure port0 is LinkUp
         * If it is previously LoopBacked, turn off LoopBack,
         * and Set AutoPollling On, and wait for LinkUp.
         */
        SWMII_bRegBitsOn(0, MII_REG_BMCR, BMCR_RESET);  
        if (SWMII_bIsRegBitsOn(0, MII_REG_BMCR, BMCR_LBK))
        {     
            SWMII_bRegBitsOff(0, MII_REG_BMCR, BMCR_LBK);
        }
        
       SWMII_vSetAutoPollOn();       
       s_vAutoPollDelay();
       
        /*
         * Wait for LinkUp
         */
        for (ii = 0; ii < AUTO_POLLING_WAIT; ii++)
        {
            SWREG_vReadU8(PHYCTL_LINK_STATUS, &byPhyCtrlReg);   
            if (byPhyCtrlReg & 0x01) break;
        }
        
        if (ii == AUTO_POLLING_WAIT)
        {
            bTestResult = FALSE;
            goto exit;
        }
        
        /*
         * Step 2, Program Phy Reg Port0, Reg0 bit[14] = 1
         * LOOP_BACK_ENABLE
         */
        SWMII_bRegBitsOn(0, MII_REG_BMCR, BMCR_LBK);
         
         /*
          * Step 3, Enable Auto Polling
          */
        SWMII_vSetAutoPollOn();
        s_vAutoPollDelay();
        
        /*
         * Step 4, Check Link Change
         */         
        for (ii = 0; ii < AUTO_POLLING_WAIT; ii++)
        {
            SWREG_vReadU8(PHYCTL_LINK_STATUS_CHANGE, &byPhyCtrlReg);   
            if (byPhyCtrlReg & 0x01) break;
        }
        if (ii == AUTO_POLLING_WAIT)
        {            
            bTestResult = FALSE;
            goto exit;
        }
        
        /*
         * Check if CPU Interface signals IRQ
         */
        if (!SWREG_bWaitStatus(CPUIF_IRQ_STATUS, IRQ_STATUS_LINK_CHG, TRUE))
        {
            bTestResult = FALSE;
            goto exit;
        };
        
exit:
        /*
         * Disable LoopBack Mode
         */
        SWMII_vSetAutoPollOff();
        SWMII_bRegBitsOff(0, MII_REG_BMCR, BMCR_LBK);
            
    }
#else
    // wait for link_change
    for (ii = 0; ii < MAX_LOOP_TIMEOUT; ii++) {
        if (g_SIsrCpuCntr.dwIsrLnkChg > dwIsrCnt)
            break;
    }
#endif
    // If time out, return result is FALSE
    if (ii == MAX_LOOP_TIMEOUT)
        bTestResult = FALSE;

    // Write back the value of isr_phy
    g_SIsrCpuCntr.dwIsrLnkChg = dwIsrCnt;

    // Clear link_change interrupt
    SWREG_vWriteU16(CPUIF_IRQ_STATUS, IRQ_STATUS_LINK_CHG);

    // Restore org value of irq mask
    SWREG_vWriteU16(CPUIF_IRQ_MASK, wOrgSwitchIrq);
    
    return bTestResult;
}


⌨️ 快捷键说明

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