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

📄 sysend.c

📁 vwworks 在 at91rm9200上的bsp配置
💻 C
字号:
/* sysEnd.c - AT91RM9200 specific library for END drivers */

/* Copyright 2004 Wind River Systems, Inc. */

/*
modification history
--------------------
01a,24sep04,pdr  written.
*/

/*
DESCRIPTION
This file contains the BSP routines in support of the END driver for the
Ethernet debug port (EMAC).

INCLUDE FILE:
*/

/* includes */

#include "vxWorks.h"
#include "stdio.h"
#include "drv/mem/memDev.h"

#ifdef INCLUDE_EMAC_END

#include "at91rm9200.h"

#include "at91EmacEnd.c"

/* defines */

#define EMAC_MAC_ADRS_OFFSET    ROUND_UP((BOOT_LINE_SIZE + 4), 4)  /* MAC  address storage area */

#define END_LD_STR_SIZE         80


/* typedefs */


/* globals */

/* locals */

/* END load strings */

LOCAL char endLoadStr[END_LD_STR_SIZE];


/* imports */

/* END device table - should be 2 (inluded end list) entries */

IMPORT END_TBL_ENTRY endDevTbl[];

IMPORT FUNCPTR _func_logMsg;


/* forward declarations */

/*******************************************************************************
*
* sysEnetAddrGet - get the hardware Ethernet address
*
* This routine determines the unique Ethernet address for the CPU board and
* copies it to <addr>, such that the low-order byte is `addr[0]' and the
* high-order byte is `addr[5]'.  The memory area pointed to by <addr> is
* six bytes.
*
* RETURNS: OK, or ERROR if the Ethernet address cannot be returned.
*/

STATUS sysEnetAddrGet
	(
	int     unit,
	UINT8 * addr
	)
	{
	STATUS status = OK;

	/* read the variable address bytes */

	status = sysNvRamGet ((char *)addr, 6, EMAC_MAC_ADRS_OFFSET);

	if ((ERROR == status) || (addr[0] == 0xFF))
		{
		/* either no non-volatile RAM or empty MAC address */

#if _BYTE_ORDER == _BIG_ENDIAN
		addr[5] = ((ENET_DEFAULT & 0x0000ff00) >> 8);
		addr[4] = ((ENET_DEFAULT & 0x00ff0000) >> 16);
		addr[3] = ((ENET_DEFAULT & 0xff000000) >> 24);
		addr[2] = CUST_ENET3;
		addr[1] = CUST_ENET4;
		addr[0] = CUST_ENET5;
#else  /* _BYTE_ORDER == _LITTLE_ENDIAN  */
		addr[0] = ((ENET_DEFAULT & 0x00ff0000) >> 16);
		addr[1] = ((ENET_DEFAULT & 0x0000ff00) >> 8);
		addr[2] =  (ENET_DEFAULT & 0x000000ff);
		addr[3] = CUST_ENET3;
		addr[4] = CUST_ENET4;
		addr[5] = CUST_ENET5;
#endif /* _BYTE_ORDER == _BIG_ENDIAN */

		return(ERROR);
		}

	return(OK);
	}


/******************************************************************************
*
* sysEnetAddrSet - set the Ethernet address for this board
*
* This routine sets the variable portion of the Ethernet address, the first
* three bytes contain a fixed manufacturer's code, while the last 3 bytes are
* set locally, to generate a unique Ethernet address on the local network.
*
* RETURN: OK, or ERROR, if out-of-memory, sysNvRamGet or -Set failed.
*
* NOMANUAL
*/

STATUS sysEnetAddrSet
	(
	char byte5,					/* Ethernet address high order byte */
	char byte4,
	char byte3,
	char byte2,
	char byte1,
	char byte0					/* Ethernet address low order byte */
	)
	{
	STATUS status = OK;
	UINT8 addr[6];

#if _BYTE_ORDER == _BIG_ENDIAN
	addr[0] = byte0;
	addr[1] = byte1;
	addr[2] = byte2;
	addr[3] = byte3;
	addr[4] = byte4;
	addr[5] = byte5;
#else  /* _BYTE_ORDER == _LITTLE_ENDIAN  */
	addr[0] = byte5;
	addr[1] = byte4;
	addr[2] = byte3;
	addr[3] = byte2;
	addr[4] = byte1;
	addr[5] = byte0;
#endif /* _BYTE_ORDER == _BIG_ENDIAN */

	/* write supplied address bytes */

	status = sysNvRamSet ((char *)addr, 6, EMAC_MAC_ADRS_OFFSET);
	if (ERROR == status)
		{
		(void)printf("sysEnetAddrSet: sysNvRamSet() FAILED.\n");
		}

	return(status);
	}


/*******************************************************************************
*
* sysEmacIntEnable - enable EMAC interrupts
*
* This routine enables EMAC interrupts.
*
* This may involve operations on interrupt control hardware.
*
* RETURNS: OK or ERROR for invalid arguments.
*/

STATUS sysEmacIntEnable
	(
	int level	/* level number */
	)
	{
	return(intEnable (level));
	}


/*******************************************************************************
*
* sysEmacIntDisable - disable EMAC interrupts
*
* This routine disables EMAC interrupts.
*
* This may involve operations on interrupt control hardware.
*
* RETURNS: OK or ERROR for invalid arguments.
*/

STATUS sysEmacIntDisable
	(
	int level	/* level number */
	)
	{
	return(intDisable (level));
	}


/*******************************************************************************
*
* sysEmacIntConnect - connect EMAC interrupts
*
* This routine connects EMAC interrupts.
*
* This may involve operations on interrupt control hardware.
*
* RETURNS: OK or ERROR for invalid arguments.
*/

STATUS sysEmacIntConnect
	(
	int         ivec,
	VOIDFUNCPTR isr,
	int         argument
	)
	{
	return(intConnect ((VOIDFUNCPTR *)ivec, isr, argument));
	}


/*******************************************************************************
*
* sysEmacEndLoad - initialize the debug ethernet driver and device
*
* This routine initializes the driver and the device to the operational state.
* All of the device specific parameters are passed in the initString.
*
* The string contains the target specific parameters like this:
*
* unit:ivec:ilevel:ioAddr:duplex:PHYAddr:speed
*
* RETURNS: An END object pointer or NULL on error.
*/

END_OBJ * sysEmacEndLoad
	(
	char *  initString,			/* String to be parsed by the driver */
    void *  arg                 /* not used */
	)
	{
	/* check load string */
	if ((char *)NULL == initString)
		{
		if (NULL != _func_logMsg)
			{
			_func_logMsg ("sysEmacEndLoad: ERROR: initString NULL\n",
						  1, 2, 3, 4, 5, 6);
			}
		return(NULL);
		}

	/* return the device name on initial call */
	if ((char)NULL == initString[0])
		{
		return(at91EmacEndLoad (initString));
		}

	/* debug ethernet interface interrupt is level triggered */
	at91IntLvlConfigure (INT_LVL_ETH, AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED);
	
	return(at91EmacEndLoad (initString));
	}


/*******************************************************************************
*
* sysLanInit - initalize the Ethernet device list
*
* RETURNS: N/A.
*/

void sysLanInit(void)
	{
	int unit = 0;				/* unit numbers */

	/*
	 * load string format
	 * [unit:]ivec:ilevel:txNum:rxNum:userFlags
	 */
	sprintf (endLoadStr, "%d:%d:%d:%d:%#x",
			 INT_VEC_ETH,	    /* ivec       */
			 INT_LVL_ETH,	    /* ilevel     */
             64,                /* txNum      */
             64,                /* rxNum      */
			 0	                /* user flags */
             );

	endDevTbl[unit].unit          = unit;
	endDevTbl[unit].endLoadFunc   = sysEmacEndLoad;
	endDevTbl[unit].endLoadString = endLoadStr;
	endDevTbl[unit].endLoan       = TRUE;

    unit++;
	}

#endif /* INCLUDE_EMAC_END */


⌨️ 快捷键说明

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