📄 sysend.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 + -