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

📄 syslib.c

📁 vxworks MPC8541 BSP
💻 C
📖 第 1 页 / 共 4 页
字号:
    _func_speProbeRtn = sysSpeProbe;#endif  /* INCLUDE_SPE */    }/******************************************************************************** sysProcNumGet - get the processor number** This routine returns the processor number for the CPU board, which is* set with sysProcNumSet().* * RETURNS: The processor number for the CPU board.** SEE ALSO: sysProcNumSet()*/int sysProcNumGet (void)    {    return (sysProcNum);    }/******************************************************************************** sysProcNumSet - set the processor number** This routine sets the processor number for the CPU board.  Processor numbers* should be unique on a single backplane.** Not applicable for the busless 8260Ads.** RETURNS: NA** SEE ALSO: sysProcNumGet()**/void sysProcNumSet    (    int 	procNum			/* processor number */    )    {    sysProcNum = procNum;    }/******************************************************************************** sysLocalToBusAdrs - convert a local address to a bus address** This routine gets the VMEbus address that accesses a specified local* memory address.** Not applicable for the 8260Ads** RETURNS: ERROR, always.** SEE ALSO: sysBusToLocalAdrs()*/ STATUS sysLocalToBusAdrs    (    int 	adrsSpace,	/* bus address space where busAdrs resides */    char *	localAdrs,	/* local address to convert */     char **	pBusAdrs	/* where to return bus address */     )    {    return (ERROR);    }/******************************************************************************** sysBusToLocalAdrs - convert a bus address to a local address** This routine gets the local address that accesses a specified VMEbus* physical memory address.** Not applicable for the 8260Ads** RETURNS: ERROR, always.** SEE ALSO: sysLocalToBusAdrs()*/STATUS sysBusToLocalAdrs    (    int  	adrsSpace, 	/* bus address space where busAdrs resides */    char *	busAdrs,   	/* bus address to convert */    char **	pLocalAdrs 	/* where to return local address */    )    {    return (ERROR);    }/******************************************************************************** sysBusTas - test and set a location across the bus** This routine does an atomic test-and-set operation across the backplane.** Not applicable for the 8260Ads.** RETURNS: FALSE, always.** SEE ALSO: vxTas()*/BOOL sysBusTas    (    char *	adrs		/* address to be tested-and-set */    )    {    return (FALSE);    }/******************************************************************************** sysBusClearTas - test and clear ** This routine is a null function.** RETURNS: NA*/void sysBusClearTas    (    volatile char * address	/* address to be tested-and-cleared */    )    {    } #ifdef INCLUDE_MOT_TSEC_END/********************************************************************************* sysFccEnetAddrGet - get the hardware Ethernet address** This routine provides the six byte Ethernet hardware address that will be* used by each individual FCC device unit.  This routine must copy* the six byte address to the space provided by <addr>.** RETURNS: OK, or ERROR if the Ethernet address cannot be returned.*/ STATUS sysTsecEnetAddrGet    (    int         unit,      	/* base address of the on-chip RAM */    UCHAR *     addr            /* where to copy the Ethernet address */    )    {    if(unit == 0)    {        if (OK != bspoutBandMac(addr))            bcopy ((char *) &sysoutbandmacAddr, (char *) addr, 6);        else            bcopy ((char *) addr,(char *) &sysoutbandmacAddr,6);        bcopy (sysoutbandmacAddr,(char *) &sysTsecEnetAddr[0],6);   }    else if(unit == 1)    {        bcopy ((char *) &sysTsecEnetAddr[1][0], (char *) addr, 6);    }    return (OK);    }#endif /* INCLUDE_MOT_TSEC_END */#ifdef INCLUDE_MOT_FCC_END/********************************************************************************* sysFccEnetAddrGet - get the hardware Ethernet address** This routine provides the six byte Ethernet hardware address that will be* used by each individual FCC device unit.  This routine must copy* the six byte address to the space provided by <addr>.** RETURNS: OK, or ERROR if the Ethernet address cannot be returned.*/ STATUS sysFccEnetAddrGet    (    int         unit,      	/* base address of the on-chip RAM */    UCHAR *     addr            /* where to copy the Ethernet address */    )    {#if 0    /*fm modify on 2006-8-22 11:54*/    if(unit == 1)    {    	sysFccEnetAddr[unit][5] = physSlotNumber();    }    /*fm modify end on 2006-8-22 11:55*/    bcopy ((char *) &sysFccEnetAddr[unit][0], (char *) addr, 6);     bcopy ((char *) &sysFccEnetAddr[0][0], (char *) sysEnetMacAddr, 6);    bcopy ((char *) &sysFccEnetAddr[1][0], (char *) sysMBEnetMacAddr, 6);#else    if(unit == 0)    {        bspBbMac(sysFccEnetAddr[0]);        bcopy ((char *) &sysFccEnetAddr[0][0], (char *) sysEnetMacAddr, 6);    }    else if(unit == 1)    {        bspMbMac(sysFccEnetAddr[1]);        bcopy ((char *) &sysFccEnetAddr[1][0], (char *) sysMBEnetMacAddr, 6);    }    bcopy ((char *) &sysFccEnetAddr[unit][0], (char *) addr, 6);#endif    return (OK);    }#endif /* INCLUDE_MOT_FCC_END */#ifdef INCLUDE_PCI 	/* board level PCI routines *//******************************************************************************** sysPciConfigEnable -  enable PCI 1 or PCI 2 bus configuration** This function enables PCI 1 or PCI 2 bus configuratation*  * RETURN: N/A*/void sysPciConfigEnable     (    int pciHost    )    {    int level;    level = intLock ();    if (pciHost == 2)        {        sysPciConfAddr = PCI2_CFG_ADR_REG;   /* PCI Configuration Address */        sysPciConfData = PCI2_CFG_DATA_REG;  /* PCI Configuration Data */        }    else /* default is for PCI 1 host */        {        sysPciConfAddr = PCI_CFG_ADR_REG;   /* PCI Configuration Address */        sysPciConfData = PCI_CFG_DATA_REG;  /* PCI Configuration Data */        }    WRS_ASM("sync;eieio");    intUnlock (level);    }/********************************************************************************* sysPciSpecialCycle - generate a special cycle with a message** This routine generates a special cycle with a message.** NOMANUAL** RETURNS: OK*/STATUS sysPciSpecialCycle    (    int		busNo,    UINT32	message    )    {    int deviceNo	= 0x0000001f;    int funcNo		= 0x00000007;    pciRegWrite ((UINT32 *)sysPciConfAddr,		 (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |		 0x80000000);    PCI_OUT_LONG (sysPciConfData, message);    return (OK);    }/********************************************************************************* sysPciConfigRead - read from the PCI configuration space** This routine reads either a byte, word or a long word specified by* the argument <width>, from the PCI configuration space* This routine works around a problem in the hardware which hangs* PCI bus if device no 12 is accessed from the PCI configuration space.** NOMANUAL** RETURNS: OK, or ERROR if this library is not initialized*/STATUS sysPciConfigRead    (    int	busNo,    /* bus number */    int	deviceNo, /* device number */    int	funcNo,	  /* function number */    int	offset,	  /* offset into the configuration space */    int width,	  /* width to be read */    void * pData /* data read from the offset */    )    {    UINT8  retValByte = 0;    UINT16 retValWord = 0;    UINT32 retValLong = 0;    STATUS retStat = ERROR;    if ((busNo == 0) && (deviceNo == 0x1f) /* simulator doesn't like this device being used */)        return (ERROR);    switch (width)        {        case 1:	/* byte */            pciRegWrite ((UINT32 *)sysPciConfAddr,			 (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |			 (offset & 0xfc) | 0x80000000);                        retValByte = PCI_IN_BYTE (sysPciConfData + (offset & 0x3));            *((UINT8 *)pData) = retValByte;	    retStat = OK;            break;        case 2: /* word */            pciRegWrite ((UINT32 *)sysPciConfAddr,			 (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |			 (offset & 0xfc) | 0x80000000);	    retValWord = PCI_IN_WORD (sysPciConfData + (offset & 0x2));            *((UINT16 *)pData) = retValWord;	    retStat = OK;	    break;        case 4: /* long */	    pciRegWrite ((UINT32 *)sysPciConfAddr,			 (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |			 (offset & 0xfc) | 0x80000000);	    retValLong = PCI_IN_LONG (sysPciConfData);            *((UINT32 *)pData) = retValLong;	    retStat = OK;            break;        default:            retStat = ERROR;            break;        }    return (retStat);    }/********************************************************************************* sysPciConfigWrite - write to the PCI configuration space** This routine writes either a byte, word or a long word specified by* the argument <width>, to the PCI configuration space* This routine works around a problem in the hardware which hangs* PCI bus if device no 12 is accessed from the PCI configuration space.** NOMANUAL** RETURNS: OK, or ERROR if this library is not initialized*/STATUS sysPciConfigWrite    (    int	busNo,    /* bus number */    int	deviceNo, /* device number */    int	funcNo,	  /* function number */    int	offset,	  /* offset into the configuration space */    int width,	  /* width to write */    ULONG data	  /* data to write */    )    {    if ((busNo == 0) && (deviceNo == 0x1f))        return (ERROR);    switch (width)        {        case 1:	/* byte */            pciRegWrite ((UINT32 *)sysPciConfAddr,			 (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |			 (offset & 0xfc) | 0x80000000);	    PCI_OUT_BYTE ((sysPciConfData + (offset & 0x3)), data);            break;        case 2: /* word */            pciRegWrite ((UINT32 *)sysPciConfAddr,			 (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |			 (offset & 0xfc) | 0x80000000);	    PCI_OUT_WORD ((sysPciConfData + (offset & 0x2)), data);	    break;        case 4: /* long */	    pciRegWrite ((UINT32 *)sysPciConfAddr,			 (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |			 (offset & 0xfc) | 0x80000000);	    PCI_OUT_LONG (sysPciConfData, data);            break;        default:            return (ERROR);                    }    return (OK);    }#endif /* INCLUDE_PCI *//* 060701 lyf add *//********************************************************************************* dbgSerInit - prepare the string out by  polling mode** This routine prepares the dbgSerChan handler for the fucntion dbgSerOutstr** RETURNS: N/A* zhaokai 2004-4-16*/void dbgSerInit (void)    {    dbgSerChan = sysSerialChanGet(0);#if 1    /*sioIoctl(dbgSerChan, SIO_MODE_SET, (void *)SIO_MODE_POLL);*/    sioIoctl(dbgSerChan, SIO_BAUD_SET, (void *)9600);#endif    }/********************************************************************************* dbgSerOutstr - Send a string out the serial port using polled I/O** This routine sends the specified string out the serial port using* polled I/O. Note that for proper display on terminals, lines of* text should be terminated with a carriage return as well as a line feed.** RETURNS: N/A* zhaokai 2004-4-16*/void dbgSerOutstr    (    char *str             /* String to be output */    )    {    int ii;    while (*str)        {        while (sioPollOutput(dbgSerChan, *str) == EAGAIN)            continue;        for (ii=0; ii < 900; ii++)            ;        str++;        }    }/* end lyf add *//******************************************************************************** sysUsDelay - delay at least the specified amount of time (in microseconds)** This routine will delay for at least the specified amount of time using the* lower 32 bit "word" of the Time Base register as the timer.  ** NOTE:  This routine will not relinquish the CPU; it is meant to perform a* busy loop delay.  The minimum delay that this routine will provide is* approximately 10 microseconds.  The maximum delay is approximately the* size of UINT32; however, there is no roll-over compensation for the total* delay time, so it is necessary to back off two times the system tick rate* from the maximum.** RETURNS: N/A*/void sysUsDelay    (    UINT32    delay        /* length of time in microsec to delay */    )    {    register UINT baselineTickCount;    register UINT curTickCount;    register UINT terminalTickCount;    register int actualRollover = 0;    register int calcRollover = 0;    UINT ticksToWait;    UINT requestedDelay;    UINT oneUsDelay;    /* Exit if no delay count */    if ((requestedDelay = delay) == 0)        return;    /*     * Get the Time Base Lower register tick count, this will be used     * as the baseline.     */    baselineTickCount = sysTimeBaseLGet();    /*     * Calculate number of ticks equal to 1 microsecond     *     * The Time Base register and the Decrementer count at the same rate:     * once per 8 System Bus cycles.     *     * e.g., 199999999 cycles     1 tick      1 second            25 ticks     *       ----------------  *  ------   *  --------         ~  --------     *       second               8 cycles    1000000 microsec    microsec     */    /* add to round up before div to provide "at least" */    oneUsDelay = ((sysTimerClkFreq + 1000000) / 1000000);    /* Convert delay time into ticks */    ticksToWait = requestedDelay * oneUsDelay;    /* Compute when to stop */    terminalTickCount = baselineTickCount + ticksToWait;    /* Check for expected rollover */    if (terminalTickCount < baselineTickCount)        {        calcRollover = 1;        }    do        {        /*         * Get current Time Base Lower register count.         * The Time Base counts UP from 0 to         * all F's.         */        curTickCount = sysTimeBaseLGet();        /* Check for actual rollover */        if (curTickCount < baselineTickCount)            {            actualRollover = 1;            }        if (((curTickCount >= terminalTickCount)	     && (actualRollover == calcRollover)) ||            ((curTickCount < terminalTickCount)	     && (actualRollover > calcRollover)))            {            /* Delay time met */

⌨️ 快捷键说明

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