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

📄 sysfei82557end.c

📁 cpc-1631的BSP包for VxWorks操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/* sysFei82557End.c - system configuration module for fei82557End */
 
/* Copyright 1984 - 1999 Wind River Systems, Inc. */
 
/*
modification history
--------------------
01c,07mar02,kab  SPR 70817: *EndLoad returns NULL on failure
01b,13apr01,pch  Check fei82557EndLoad() return for NULL not ERROR
01a,20oct99,mtl  written from yk 750 by teamF1
*/


/*
DESCRIPTION
This is the WRS-supplied configuration module for the VxWorks 
fei82557End (fei) END driver.  It performs the dynamic parameterization 
of the fei82557End driver.  This technique of 'just-in-time' 
parameterization allows driver parameter values to be declared 
as something other than static strings. 
*/

#if (defined(INCLUDE_FEI_END) && defined (INCLUDE_NETWORK)	\
     && defined (INCLUDE_END))
 
/* includes */

#include "vxWorks.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "end.h"
#include "config.h"

#include "fei82557End.h"	

/* imports */

IMPORT FUNCPTR feiEndIntConnect;
IMPORT FUNCPTR feiEndIntDisconnect;
IMPORT END_OBJ * fei82557EndLoad (char *);

/* defines */

#ifdef I82557_DEBUG
#   undef       LOCAL
#   define      LOCAL
#endif  /* I82557_DEBUG */
 

/* Intel EtherExpress PRO100B LAN Adapter type */
 
#define TYPE_PRO100B_PCI        1       /* Intel EtherExpress PRO-100B PCI */
 
/* EEPROM control bits */
 
#define EE_SK           0x01            /* shift clock */
#define EE_CS           0x02            /* chip select */
#define EE_DI           0x04            /* chip data in */
#define EE_DO           0x08            /* chip data out */
 
/* EEPROM opcode */
 
#define EE_CMD_WRITE    0x05            /* WRITE opcode, 101 */
#define EE_CMD_READ     0x06            /* READ  opcode, 110 */
#define EE_CMD_ERASE    0x07            /* ERASE opcode, 111 */
 
/* EEPROM misc. defines */
 
#define EE_CMD_BITS     3               /* number of opcode bits */
#define EE_ADDR_BITS    6               /* number of address bits */
#define EE_DATA_BITS    16              /* number of data bits */
#define EE_SIZE         0x40            /* 0x40 words */
#define EE_CHECKSUM     0xbaba          /* checksum */
 
/* unknown values */

#define UNKNOWN         -1
 
 
 
/* FEI driver access routines */
 
/* typedefs */
 
typedef struct feiResource              /* FEI_RESOURCE */
    {
    UINT32      membaseCsr;             /* Base Address Register 0 */
    UINT32      iobaseCsr;              /* Base Address Register 1 */
    UINT32      membaseFlash;           /* Base Address Register 2 */
    char        irq;                    /* Interrupt Request Level */
    UINT32      configType;             /* type of configuration - unused */
    UINT32      boardType;              /* type of LAN board this unit is */
    UINT32      pciBus;                 /* PCI Bus number */
    UINT32      pciDevice;              /* PCI Device number */
    UINT32      pciFunc;                /* PCI Function number */
    UINT32      eeprom[0x40];           /* Ethernet Address of this unit */
    INT32       timeout;                /* timeout for the self-test */
    INT32       str[6];                 /* storage for the self-test result */
    INT32       *pResults;              /* pointer to the self-test result */
    UINT        memLength;              /* required memory size */
    UINT        initialStateMask;       /* mask parameter to vmStateSet */
    UINT        initialState;           /* state parameter to vmStateSet */
    } FEI_RESOURCE;
 
 
/* locals */
LOCAL STATUS sys557IntEnable
    (
    int    unit                /* END driver unit number */
    );
LOCAL STATUS sys557IntDisable
    (
    int    unit                /* END driver unit number */
    );

LOCAL UINT32 sys557LocalToPciBusAdrs (int unit, UINT32 adrs);
LOCAL UINT32 sys557PciBusToLocalAdrs (int unit, UINT32 adrs);
LOCAL UINT32 feiUnits;                  /* number of FEIs we found */
 
LOCAL FEI_RESOURCE feiResources [FEI_MAX_UNITS] =
    {
    {UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
     UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, {UNKNOWN}, UNKNOWN, {UNKNOWN}, NULL,
     UNKNOWN, UNKNOWN, UNKNOWN},
    {UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
     UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, {UNKNOWN}, UNKNOWN, {UNKNOWN}, NULL,
     UNKNOWN, UNKNOWN, UNKNOWN},
    {UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
     UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, {UNKNOWN}, UNKNOWN, {UNKNOWN}, NULL,
     UNKNOWN, UNKNOWN, UNKNOWN},
    {UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
     UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, {UNKNOWN}, UNKNOWN, {UNKNOWN}, NULL,
     UNKNOWN, UNKNOWN, UNKNOWN},
     };
 
LOCAL const char *phys[] =
    {
     "None", "i82553-A/B", "i82553-C", "i82503",
     "DP83840", "80c240", "80c24", "unknown"
     };
 
enum phy_chips
    {
    NonSuchPhy=0, I82553AB, I82553C, I82503,
    DP83840, S80C240, S80C24, UndefinedPhy
    };
 
LOCAL const char *connectors[] = {" RJ45", " BNC", " AUI", " MII"};
 
 
/* forward declarations */

LOCAL UINT16    sys557eepromRead (int unit, int location);
LOCAL UINT16    sys557mdioRead   (int unit, int phyId, int location);
LOCAL UINT16    sys557mdioWrite  (int unit, int phyId, int location, int value);
LOCAL int       sys557IntAck     (int unit);




/******************************************************************************
*
* sysFei82557EndLoad - load fei82557 (fei) device.
*
* This routine loads the fei device with initial parameters. 
*
* RETURNS: pointer to END object or NULL.
*
* SEE ALSO: fei82557EndLoad()
*/
 
END_OBJ * sysFei82557EndLoad
    (
    char * pParamStr,   /* ptr to initialization parameter string */
    void * unused       /* unused optional argument */
    )
    {
    /*
     * The fei82557End driver END_LOAD_STRING should be:
     * "<memBase>:<memSize>:<nTfds>:<nRfds>:<flags>"
     *
     */

    char * cp; 			
    char paramStr [END_INIT_STR_MAX];   /* from end.h */
    END_OBJ * pEnd;

    if (strlen (pParamStr) == 0)
        {
        /* 
         * muxDevLoad() calls us twice.  If the string is
         * zero length, it is asking for the device name so
         * we just return whatever fei82557EndLoad provides.
         */

        pEnd = fei82557EndLoad (pParamStr);
        }

    else
	{
        /*
         * On the second pass though here, we actually create 
         * the initialization parameter string on the fly.   
         * Note that we will be handed our unit number on the 
         * second pass through and we need to preserve that information.
         * So we use the unit number handed from the input string.
         */

        cp = strcpy (paramStr, pParamStr); /* cp points to paramStr */

        /* Now, we advance cp, by finding the end the string */

        cp += strlen (paramStr);
        
        /* finish off the initialization parameter string */

	sprintf (cp, "-1:0x00:0x20:0x20:0x00");

        if ((pEnd = fei82557EndLoad (paramStr)) == (END_OBJ *)NULL)
	    {
            printf ("Error: device failed fei82557EndLoad routine.\n");
	    }
	}

    return (pEnd);
    }



/*******************************************************************************
*
* sys557PciInit - prepare LAN adapter for 82557 initialization
*
* This routine find out the PCI device, and map its memory and IO address.
* It must be done prior to initializing the 82557, sys557Init().  Also
* must be done prior to MMU initialization, usrMmuInit().
*
* RETURNS: N/A
*/
 
void sys557PciInit (void)
    {
    FEI_RESOURCE *pReso;
    int pciBus;
    int pciDevice;
    int pciFunc;
    int unit;
    BOOL duplicate;
    UINT32 membaseCsr;
    UINT32 iobaseCsr;
    UINT32 membaseFlash;
    char irq;
    int ix;
 
    for (unit = 0; unit < FEI_MAX_UNITS; unit++)
        {
        if (pciFindDevice (PRO100B_PCI_VENDOR_ID, PRO100B_PCI_DEVICE_ID, unit,
                           &pciBus, &pciDevice, &pciFunc) != OK)
            break;
 
        /* check the duplicate */
 
        pReso     = &feiResources [0];
        duplicate = FALSE;
 
        for (ix = 0; ix < FEI_MAX_UNITS; ix++, pReso++)
            {
            if ((ix != unit) && (pReso->pciBus == pciBus) &&
                (pReso->pciDevice == pciDevice) && (pReso->pciFunc == pciFunc))
                duplicate = TRUE;
            }
 
        if (duplicate)
            continue;
 
        /* we found the right one */
 
        pReso = &feiResources [unit];
        pReso->pciBus    = pciBus;
        pReso->pciDevice = pciDevice;
        pReso->pciFunc   = pciFunc;
				
if(unit ==0)
{
		membaseCsr = 0xed000000;
		iobaseCsr = 0xf400;
		 irq = 0x3;
		 
 		pciConfigOutLong(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x10,membaseCsr);
		pciConfigOutLong(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x14,iobaseCsr);
 		pciConfigOutByte(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x3c,irq);

}
else
{
		membaseCsr = 0xee000000;
		iobaseCsr = 0xf600;
		 irq = 0x4;
		 
 		pciConfigOutLong(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x10,membaseCsr);
		pciConfigOutLong(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x14,iobaseCsr);
 		pciConfigOutByte(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x3c,irq);

}

        /* get memory base address and IO base address */
 
        pciConfigInLong (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
                         PCI_CFG_BASE_ADDRESS_0, &membaseCsr);
        pciConfigInLong (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
                         PCI_CFG_BASE_ADDRESS_1, &iobaseCsr);
        pciConfigInLong (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
                         PCI_CFG_BASE_ADDRESS_2, &membaseFlash);
        pciConfigInByte (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
                         PCI_CFG_DEV_INT_LINE, &irq);
				
 		/*printf("\nunit = %d,membaseCsr=0x%x,iobaseCsr=0x%x,membaseFlash=0x%x,irq=0x%x\n",unit,membaseCsr,iobaseCsr,membaseFlash,irq);*/

        membaseCsr   &= PCI_MEMBASE_MASK;
        iobaseCsr    &= PCI_IOBASE_MASK;
        membaseFlash &= PCI_MEMBASE_MASK;
 		/*printf("\nunit = %d,membaseCsr1=0x%x,iobaseCsr1=0x%x,membaseFlash1=0x%x,irq1=0x%x\n",unit,membaseCsr,iobaseCsr,membaseFlash,irq);*/

        /* over write the resource table with read value */
 
        pReso->membaseCsr   = membaseCsr;
        pReso->iobaseCsr    = iobaseCsr; 
        pReso->membaseFlash = membaseFlash;
        pReso->irq          = irq;
 
        /* enable mapped memory and IO addresses */
 
        pciConfigOutWord (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
                          PCI_CFG_COMMAND, PCI_CMD_IO_ENABLE |
                          PCI_CMD_MEM_ENABLE | PCI_CMD_MASTER_ENABLE);
        feiUnits++;
        }
 
    /* specify the interrupt connect/disconnect routines to be used */

    feiEndIntConnect = (FUNCPTR) intConnect;
    feiEndIntDisconnect = NULL;
    }
 

/*******************************************************************************
*
* sys557Init - prepare LAN adapter for 82557 initialization
*
* This routine is expected to perform any adapter-specific or target-specific
* initialization that must be done prior to initializing the 82557.
*
* The 82557 driver calls this routine from the driver attach routine before
* any other routines in this library.
*
* This routine returns the interrupt level the <pIntLvl> parameter.
*
* RETURNS: OK or ERROR if the adapter could not be prepared for initialization.
*/
 
STATUS sys557Init
    (
    int unit,                   /* unit number */
    FEI_BOARD_INFO *pBoard      /* board information for the end driver */
    )
    {
    FEI_RESOURCE *pReso = &feiResources [unit];
    UINT16 sum          = 0;
    int ix;
    int iy;
    UINT16 value;
 
    if (unit >= feiUnits)
        return (ERROR);
 
    /* locate the 82557 based adapter. PRO100B and XXX */
 
    if (pReso->boardType == TYPE_PRO100B_PCI)   /* only setup once */
        {
        }
    else
        {
        /* read the configuration in EEPROM */
 
        for (ix = 0; ix < EE_SIZE; ix++)
            {
            value = sys557eepromRead (unit, ix);
            pReso->eeprom[ix] = value;
            sum += value;
            }
 
        if (sum != EE_CHECKSUM)
            printf ("i82557(%d): Invalid EEPROM checksum %#4.4x\n", unit, sum);
 
        /* DP83840 specific setup */
 
        if (((pReso->eeprom[6]>>8) & 0x3f) == DP83840)
            {
            int reg23 = sys557mdioRead (unit, pReso->eeprom[6] & 0x1f, 23);
            sys557mdioWrite (unit, pReso->eeprom[6] & 0x1f, 23, reg23 | 0x0420);
            }
 
        /* perform a system self-test. */
 
        pReso->timeout     = 16000;             /* Timeout for set-test.  */
        pReso->pResults    = (int *) ((((int) pReso->str) + 0xf) & ~0xf);
        pReso->pResults[0] = 0;
        pReso->pResults[1] = -1;
        sysOutLong (PCI_MEMIO2LOCAL ((pReso->membaseCsr + SCB_PORT)),
                    (int)pReso->pResults | 1);
        do  {

⌨️ 快捷键说明

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