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

📄 sysmotfccend.c

📁 Embedded Planet公司的ep8260单板计算机的BSP包(VxWorks)
💻 C
📖 第 1 页 / 共 2 页
字号:
/* sysMotFccEnd.c - system configuration module for motFccEnd driver */
 
/* Copyright 1984-2001 Wind River Systems, Inc. */
#include "copyright_wrs.h"
 
/*
modification history
--------------------
01a,12oct01, gev  created
*/
 
/*
DESCRIPTION
This is the WRS-supplied configuration module for the VxWorks
motFccEnd END driver.

It performs the dynamic parameterization of the motFccEnd driver.
This technique of 'just-in-time' parameterization allows driver
parameter values to be declared as any other defined constants rather
than as static strings.
*/

#include "vxWorks.h"
#include "config.h"
 
#include "vmLib.h"
#include "stdio.h"
#include "sysLib.h"
#include "logLib.h"
#include "stdlib.h"
#include "string.h"
#include "end.h"
#include "intLib.h"
#include "lstLib.h"
#include "sys82xxDpramLib.h"
#include "miiLib.h"

/* defines */

#if !defined(M8260_CMXFCR)
  #define M8260_CMXFCR(base)   (CAST(VUINT32 *)((base) + 0x11B04)) 
#endif

#ifdef INCLUDE_MOT_FCC

#define MOT_FCC_NUM_UNIT0	0x03	/* FCC3 is unit 0 */
#define MOT_FCC_NUM_UNIT1	0x02	/* FCC2 is unit 1 */
#define MOT_FCC_TBD_NUM		0x40	/* transmit buffer descriptors (TBD)*/
#define MOT_FCC_RBD_NUM		0x20	/* receive buffer descriptors (RBD)*/
#define MOT_FCC_PHY_ADDR	0x00	/* PHY address */
#define MOT_FCC_DEF_PHY_MODE	0x02	/* PHY's default operating mode */
#define MOT_FCC_BDS_SIZE	(2 * 1024)

/* imports */
 
IMPORT END_OBJ *motFccEndLoad (char *);
IMPORT UINT32	sysPCGet (void);
IMPORT FUNCPTR	_func_motFccPhyLSCInt;
IMPORT FUNCPTR  _func_motFccPhyInit;
IMPORT FUNCPTR  _func_motFccPhyDuplex;
IMPORT STATUS	miiPhyInit (PHY_INFO * phyInfo);


/* globals */

UINT8 sysFccEnetAddr[MAC_ADRS_LEN] /* = ETHERNET_MAC_ADRS */ ;
UINT32 miiNumLinkChgInts = 0;
UINT32 miiBitRdCount = 0;
UINT32 miiBitWrCount = 0;

/* locals */

/*
 * this table may be customized by the user to force a
 * particular order how different technology abilities may be
 * negotiated by the PHY. Entries in this table may be freely combined
 * and even OR'd together.
 */
 
LOCAL INT16 motFccAnOrderTbl [] = {
                                MII_TECH_100BASE_TX,    /* 100Base-T */
                                MII_TECH_100BASE_T4,    /* 10Base-T */
                                MII_TECH_10BASE_T,      /* 100Base-T4 */
                                MII_TECH_10BASE_FD,     /* 100Base-T FD*/
                                MII_TECH_100BASE_TX_FD, /* 10Base-T FD */
                                -1                      /* end of table */
                               };

/* forward declarations */

void   sysEnetAddrSet(unsigned char,unsigned char,unsigned char,unsigned char,unsigned char,unsigned char);
STATUS sysEnetAddrGet(int  unit, UINT8 *addr);
STATUS sysFccEnetAddrGet (int unit,UCHAR *address);
STATUS sysFccEnetEnable (UINT32 immrVal, UINT8 fccNum);
STATUS sysFccEnetCommand(UINT32 immrVal, UINT8	fccNum,	UINT16	command);
STATUS sysFccMiiBitWr (UINT32 immrVal, UINT8 fccNum, INT32 bitVal);
STATUS sysFccMiiBitRd (UINT32 immrVal, UINT8 fccNum, INT8 * bitVal);
STATUS sysFccEnetDisable (UINT32 immrVal, UINT8 fccNum);


/******************************************************************************
*
* sysMotFccEndLoad - load an istance of the motFccEnd driver
*
* This routine loads the motFccEnd driver with proper parameters. It also
* reads the BCSR3 to find out which type of processor is being used, and
* sets up the load string accordingly.
*
* The END device load string formed by this routine is in the following
* format.
* <immrVal>:<fccNum>:<bdBase>:<bdSize>:<bufBase>:<bufSize>:<fifoTxBase>
* :<fifoRxBase>:<tbdNum>:<rbdNum>:<phyAddr>:<phyDefMode>:<pAnOrderTbl>:
* <userFlags>
*
* .IP <immrVal>
* Internal memory address
* .IP <fccNum>
* FCC number being used
* .IP <bdBase>
* buffer descriptors base address
* .IP <bdSize>
* buffer descriptors space size
* .IP <bufBase>
* data buffers base address
* .IP <bufSize>
* data buffers space size
* .IP <fifoTxBase>
* tx buffer in internal memory
* .IP <fifoRxBase>
* rx buffer in internal memory
* .IP <tbdNum>
* number of TBDs or NONE
* .IP <rbdNum>
* number of RBDs or NONE
* .IP <phyAddr>
* address of a MII-compliant PHY device
* .IP <phyDefMode>
* default operating mode of a MII-compliant PHY device
* .IP <pAnOrderTbl>
* auto-negotiation order table for a MII-compliant PHY device or NONE
*
* This routine only loads and initializes one instance of the device.
* If the user wishes to use more than one motFccEnd devices, this routine
* should be changed.
*
* RETURNS: pointer to END object or ERROR.
*
* SEE ALSO: motFccEndLoad ()
*/
 
END_OBJ * sysMotFccEndLoad
    (
    char * pParamStr,   /* ptr to initialization parameter string */
    void * unused       /* unused optional argument */
    )
    {
    /*
     * The motFccEnd driver END_LOAD_STRING should be:
     * <immrVal>:<fccNum>:<bdBase>:<bdSize>:<bufBase>:<bufSize>:<fifoTxBase>
     * :<fifoRxBase>:<tbdNum>:<rbdNum>:<phyAddr>:<phyDefMode>
     * :<pAnOrderTbl>:<userFlags>:<mBlkRatio>:<clusterRatio>
     * Note that unit string is prepended by the mux, so we
     * don't put it here.
     */
 
char	*pStr = NULL;
char	paramStr [300];
UINT32	regPC;
UINT32	motFccBufsDescAdr;
UINT32	motFccBufsDescSize;
UINT32	motFccBufsAdr;
UINT32	motFccBufsSize;
UINT32	motFccFlags;
END_OBJ	*pEnd;
int      unitNumber;

static char motFccEndParamTemplate [] = 
    "0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x";

    if (strlen (pParamStr) == 0) {
        /*
         * muxDevLoad() calls us twice.  If the string is
         * zero length, then this is the first time through
         * this routine.
         */

        pEnd = (END_OBJ *) motFccEndLoad  (pParamStr);
    }else{
        /* Chuck (PTR Group) Added: */
        unitNumber = pParamStr[0] - '0';
        if ((unitNumber > 0) && (ptrGetBoardID() != 0))
        {
          /* Only SBC1 (boardID 0) has multiple network interfaces. */
          return NULL;
        }

	regPC = sysPCGet();
	
	/* ROM resident applications MUST use the LOCAL BUS options,
         * while RAM resident MAY use the option, which forces all
         * driver buffers (rx and tx) to reside in local bus space. The
         * drawback to having buffers on the local bus is that the driver
         * MUST copy all transmit packets to the local bus -- so zcopy
         * must be inhibited. The driver still passes rx data zcopy.
         */

	if((regPC & ROM_BASE_ADRS) == ROM_BASE_ADRS){
	    /* We are running from ROM and, for ROM apps, we must specify
	     * local bus space for the buffers.  This code uses the upper
	     * half of local bus memory.  It is up to the user to make a
	     * more suitable choice if need be.
	     */
	    motFccBufsAdr = LOCAL_BUS_SDRAM_ADRS + (LOCAL_BUS_SDRAM_SIZE >> 1);
            motFccBufsSize = LOCAL_BUS_SDRAM_SIZE >> 1;
            
	    /* for ROM apps, MOT_FCC_FLAGS *must* include the following. */
            motFccFlags = 0x00005000; /*(MOT_FCC_USR_BUF_LBUS|MOT_FCC_USR_NO_ZCOPY)*/
						
            /* NOTE! The FCC driver internally forces MOT_FCC_USR_NO_ZCOPY if
	     * MOT_FCC_USR_BUF_LBUS is set in MOT_FCC_FLAGS, making the
	     * inclusion of 'NO_ZCOPY not strictly required. The 'NO_ZCOPY
	     * flag can be used independently of the bus on which buffers
	     * reside -- for those rare apps that might need this option.
             */
	}else{
	    /* We are running from RAM */

	    /* for RAM apps, let the driver find space for the buffers */
	    motFccBufsAdr = -1UL;
	    motFccBufsSize = -1UL;
	    motFccFlags = 0;
	}

	/* Chuck (PTR Group) Added: */
	motFccFlags |= 0x8000 /*MOT_FCC_USR_DPRAM_ALOC*/;

	/* NOTE! Regarding bus choices for BDs and buffers.
         * If you give a local bus address for BDs and don't include
         * MOT_FCC_USR_BD_LBUS in MOT_FCC_FLAGS, the CPM will hang.
         * If you give a local bus address for buffers and don't include
         * MOT_FCC_USR_BUF_LBUS in MOT_FCC_FLAGS, the CPM will hang.
         * If you give a 60x bus address for buffers and/or BDs and
         * mistakenly include either a 'LBUS flag, the CPM will hang.
        */

	/* If you want the driver to decide where to put the BDs, set
	 * BOTH of the following motFccBufsDescAdr & motFccBufsDescSize
	 * to -1UL. If you decide to force the driver to use BDs on the
	 * local bus, set the following motFccBufsDescAdr to a local bus
	 * address and size AND be sure to add MOT_FCC_USR_BD_LBUS to the
	 * definition of MOT_FCC_FLAGS below. The defaults use internal
	 * DPRAM for BDS. You may optionally specify a 60x bus address for
	 * BDS. In these cases do not set the LBUS flag.
         */

	motFccBufsDescSize = MOT_FCC_BDS_SIZE;
	motFccBufsDescAdr = (UINT32)sys82xxDpramAlignedMalloc(MOT_FCC_BDS_SIZE,8);
	if(motFccBufsDescAdr == NULL){
	    motFccBufsDescAdr = -1UL;
	}

        /*
         * On the second pass through here, we actually create
         * the initialization parameter string on the fly.
         * Note that we will be handed our unit number on the
         * second pass and we need to preserve that information.
         * So we use the unit number handed from the input string.
         */
 
        pStr = strcpy (paramStr, pParamStr);
        /* Now, we get to the end of the string */
        pStr += strlen (paramStr);
 
	/* finish off the initialization parameter string */
        sprintf (pStr, motFccEndParamTemplate,
			(UINT) vxImmrGet (),
			(unitNumber ? MOT_FCC_NUM_UNIT1 : MOT_FCC_NUM_UNIT0),
			motFccBufsDescAdr,
			motFccBufsDescSize,
			motFccBufsAdr,
			motFccBufsSize,
			-1UL,-1UL,
			MOT_FCC_TBD_NUM,  	
			MOT_FCC_RBD_NUM,  	
			MOT_FCC_PHY_ADDR,  	
			MOT_FCC_DEF_PHY_MODE,  	
			&motFccAnOrderTbl,
			motFccFlags,
			3,	/* driver allocates (3 * MOT_FCC_RBD_NUM) mblks */
			4	/* driver allocates (4 * MOT_FCC_RBD_NUM) clusters */
		 );

        if ((pEnd = (END_OBJ *) motFccEndLoad  (paramStr)) == (END_OBJ *)ERROR) {
            logMsg ("Error: motFccEndLoad  failed to load driver\n", 0, 0, 0, 0, 0, 0);
	}
    }
    return pEnd;
}

/****************************************************************************
*                                                                          
* Function : sysEnetAddrSet( unsigned char byte5,.....byte1)            
*                                                                          
* Purpose. : Sets the 6 byte ethernet address used by the ethernet device. 
*                                                                          
* Returns. : OK                                                            
*                                                                          
* Notes... : None                                                          
*                                                                          
*/

void  sysEnetAddrSet 
	(
		unsigned char byte5,
		unsigned char byte4,
		unsigned char byte3,
		unsigned char byte2,
		unsigned char byte1,
		unsigned char byte0
	)
	{
	 sysFccEnetAddr[0] = byte5;
	 sysFccEnetAddr[1] = byte4;
	 sysFccEnetAddr[2] = byte3;
	 sysFccEnetAddr[3] = byte2;
	 sysFccEnetAddr[4] = byte1;
	 sysFccEnetAddr[5] = byte0;

#ifdef  MAC_ADRS_IN_NVRAM 
     sysNvRamSet((char *)&sysFccEnetAddr[0], MAC_ADRS_LEN, NV_MAC_ADRS_OFFSET );
#endif
	}

/****************************************************************************
*                                                                          
* Function : sysEnetAddrGet( int unit , UINT8 * addr )                     
*                                                                          
* Purpose. : Gets the 6 byte ethernet address used by the ethernet device. 
*                                                                          
* Returns. : OK                                                            
*                                                                          
* Notes... : None                                                          
*                                                                          
*/

STATUS sysEnetAddrGet
    (
       int  unit ,       /* not used                                        */ 
       UINT8 *  addr     /* Location address is returned in                 */
    )
{
#ifdef  MAC_ADRS_IN_NVRAM 

	sysNvRamGet(addr, MAC_ADRS_LEN, NV_MAC_ADRS_OFFSET );

#else
        /* mac address in memory only */
	int n;

	for ( n=0; n < MAC_ADRS_LEN ;n++)
        {
          *(addr+n) = (char)sysFccEnetAddr[n];
        }
#endif

    /* Chuck (PTR Group) Added: */
    if (unit == 1)
    {
      addr[3] += 0x80;
    }

    return( OK ) ;
}

LOCAL STATUS sysMiiPhyDuplex(PHY_INFO *pPhyInfo,int *duplex)
{
UINT16		miiStat;
int		retVal;

    MII_READ(pPhyInfo->phyAddr,17,&miiStat,retVal);
    if(retVal == OK){
	*duplex = (miiStat & 0x200) ? 1 : 0;
    }
    return retVal;
}

#if 0
LOCAL void sysMiiInt(PHY_INFO *pPhyInfo)
{
UINT16	miiIntStatusReg;
int	tmp;

    /* Clear MII interrupt by reading Int status reg */
    MII_READ(pPhyInfo->phyAddr,19,&miiIntStatusReg,tmp);
    ++miiNumLinkChgInts;
    if(_func_motFccPhyLSCInt){
	(* _func_motFccPhyLSCInt)(pPhyInfo->pDrvCtrl);
    }
}
#endif

LOCAL STATUS sysMiiPhyInit(PHY_INFO *pPhyInfo)
{
int	retVal;

    retVal = miiPhyInit(pPhyInfo);
#if 0
    if(retVal == OK){
	int	tmp;
	UINT16	miiIntEnableReg;

	MII_READ(pPhyInfo->phyAddr,18,&miiIntEnableReg,tmp);
	if(tmp == OK){

⌨️ 快捷键说明

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