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

📄 swmodl.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:    swmodl.c
 *
 * Purpose: Module card detecting and setting functions
 *
 * Author:  Tevin Chen
 *
 * Date:    Jan 08, 2002
 *
 * Functions:
 *
 * Revision History:
 *
 */


#if !defined(__PLATFORM_H__)
#include "platform.h"
#endif
#if !defined(__SWCFG_H__)
#include "swcfg.h"
#endif
#if !defined(__SWITCH_H__)
#include "switch.h"
#endif
#if !defined(__SWREG_H__)
#include "swreg.h"
#endif
#if !defined(__SWEEP_H__)
#include "sweep.h"
#endif
#if !defined(__SWMII_H__)
#include "swmii.h"
#endif
#if !defined(__SWMODL_H__)
#include "swmodl.h"
#endif




/*---------------------  Static Definitions  ------------------------*/
#define PIN_DEFINE_NC               0x0F

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

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

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

/*---------------------  Static Variables  --------------------------*/
volatile UINT8 *sg_pioModuleAddr = (volatile UINT8 *)PLAT_ASIC_MODULE_BASE_ADDR;

/*---------------------  Static Functions  --------------------------*/
static UINT8 s_byGetTypeFromModlEeprom(UINT8 byModuleCardId);
static UINT8 s_byGetTypeFromMoldPinDef(UINT8 byModuleCardId);
static UINT8 s_byGetTypeFromStrapping(UINT8 byModuleCardId);
static BOOL s_bIsModulePresent (UINT8 byModuleCardId);

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




UINT8 SWMODL_byDetectModuleType (UINT8 byModuleCardId)
{
    UINT8   byModuleType;

    
    // Check module card present
    if (!s_bIsModulePresent(byModuleCardId) )
        return MOD_CARD_NA;

    byModuleType = MOD_CARD_NA;

    // If Module card on board i2c eeprom exist, read from i2c eeprom
    byModuleType = s_byGetTypeFromModlEeprom(byModuleCardId);

    // If on board i2c eeprom does not exist, judge pin define.
    // If Module card has pin definition, read pin define data
    if (byModuleType == MOD_CARD_NA)
        byModuleType = s_byGetTypeFromMoldPinDef(byModuleCardId);

    // If pin define NC, read switch strapping information
    if (byModuleType == MOD_CARD_NA)
        byModuleType = s_byGetTypeFromStrapping(byModuleCardId);
    
    return byModuleType;
}


void SWMODL_vEEPCalCheckSum (UINT8 u8ModId, UINT16 wCksumSize)
{
    UINT8    bySromPtr;
    UINT8    byCheckSum = 0;
    UINT16  ii, wStartAddr = MOD_CARD0_EEP_ADDR_SIGNATURE + u8ModId * MOD_CARD_EEP_SIZE;


    for (ii = 0; ii < (wCksumSize - 1); ii++) {
        SWEEP_bReadU8(wStartAddr + ii, &bySromPtr);
        byCheckSum ^= bySromPtr;
    }

    SWEEP_bWriteU8((UINT16)(MOD_CARD0_EEP_ADDR_CHECKSUM + u8ModId * MOD_CARD_EEP_SIZE), byCheckSum);
}


static UINT8 s_byGetTypeFromModlEeprom(UINT8 byModuleCardId)
{
    UINT8   byData = 0;
    UINT8   byChecksum = 0;
    UINT16  ui, u16CksumSize;
    UINT16  byStartAddr = MOD_CARD0_EEP_BASE_ADDR + MOD_CARD_EEP_SIZE * byModuleCardId;



    // If on baord i2c eeprom exist, check module card signature
    SWEEP_bReadU8(MOD_CARD0_EEP_ADDR_SIGNATURE + byModuleCardId * MOD_CARD_EEP_SIZE, &byData);
    if (byData != MOD_CARD_SIGNATURE)
        return MOD_CARD_NA;

    SWEEP_bReadU8(MOD_CARD0_EEP_ADDR_CKSUMSIZE + byModuleCardId * MOD_CARD_EEP_SIZE, &byData);
    u16CksumSize = byData * CHECKSUM_SIZE_UNIT;
    // Check Module Card Checksum value to varify eeprom value correct.
    for (ui = 0; ui < u16CksumSize; ui++) {
    	SWEEP_bReadU8(byStartAddr + ui, &byData);
        byChecksum ^= byData;
    }

    if (byChecksum != 0)
        return MOD_CARD_NA;

    // Check module card type
    SWEEP_bReadU8(MOD_CARD0_EEP_ADDR_TYPE + byModuleCardId * MOD_CARD_EEP_SIZE, &byData);

    return byData;
}


static UINT8 s_byGetTypeFromMoldPinDef(UINT8 byModuleCardId)
{
    UINT8  byPinDefineData = 0;



#if defined(__SWITCH_CPUIF_PCI) || defined(__CPU_S3C2510A)
    //S3C2510A
    byPinDefineData = (ASIC_IOP_DATA1 >> 5);
#else
    byPinDefineData = *sg_pioModuleAddr;
#endif
    
    if (byModuleCardId)
        byPinDefineData >>= 0x04;
    else
        byPinDefineData &= 0x0F;

    if (byPinDefineData == PIN_DEFINE_NC)
        return MOD_CARD_NA;

    return byPinDefineData;
}


static UINT8 s_byGetTypeFromStrapping(UINT8 byModuleCardId)
{
    UINT16  u16GigaStrapping;

    // Get giga port strapping value
    SWREG_vReadU16(INITCTL_CHIP_STRAP_CFG, &u16GigaStrapping);
        
    if (((byModuleCardId == 0) && (u16GigaStrapping & CHIP_CFG_GIGA0_GMII))
       || ((byModuleCardId == 1) && (u16GigaStrapping & CHIP_CFG_GIGA1_GMII)) ) {
        // GMII mode
        return MOD_CARD_1000TX;
    }
    else {
        // If TBI, it must be 1000FX(single) mode.
        return MOD_CARD_1000FX_SIGMODE;
    }

}


static BOOL s_bIsModulePresent (UINT8 byModuleCardId)
{
    
    if (SWREG_bIsBitsOnU8(PHYCTL_PORT24_TBI_MODE + (byModuleCardId*2), MODULE_CARD_PRESENT) )
        return TRUE;
    return FALSE;
}

⌨️ 快捷键说明

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