Ethernet Code File
Ethernet Code File
#define TX_PACKET_SIZE 43
/* Packet generation function */
void PacketGen( BYTE *txptr )
{
int i;
DWORD crcValue;
DWORD BodyLength = TX_PACKET_SIZE - 38;
/* check sum */
*(txptr+24) = 0x00;
*(txptr+25) = 0x00;
/* Source IP 192.100.100.101 */
*(txptr+26) = 0x65;
*(txptr+27) = 0x64;
*(txptr+28) = 0x64;
*(txptr+29) = 0xC0;
/* destination IP 192.100.100.102 */
*(txptr+30) = 0x66;
*(txptr+31) = 0x64;
*(txptr+32) = 0x64;
*(txptr+33) = 0xC0;
return;
}
/* MAIN function */
/* Generate Packet */
AllPacketGen();
/*Enable Tranmission */
EMAC_TxEnable();
/* continous loop */
while ( 1 )
{
/* load txptr with buffer address */
txptr = (BYTE *)EMAC_TX_BUFFER_ADDR;
}
}
return 0;
}
/***********************************************************************
End of emactest.c file
***********************************************************************/
/***********************************************************************
emac.c program
***********************************************************************/
/* number of tx descriptors, 16 */
MAC_TXDESCRIPTORNUM = EMAC_TX_DESCRIPTOR_COUNT - 1;
regVal = MAC_MODULEID;
if ( regVal == PHILIPS_EMAC_MODULE_ID )
{
PINSEL2 = 0x50151105; /* selects P1[0,1,4,6,8,9,10,14,15] */
}
else
{
PINSEL2 = 0x50150105; /* selects P1[0,1,4,8,9,10,14,15] */
}
PINSEL3 = 0x00000005; /* selects P1[17:16] */
// Reset all
MAC_COMMAND |= 0x00000240;
/* back to back int-packet gap */
MAC_IPGT = 0x0012; /* IPG setting in half duplex mode */
EMACTxDescriptorInit();
EMAC_TxEnable();
EMAC_RxEnable();
return ( TRUE );
}
TxProduceIndex = MAC_TXPRODUCEINDEX;
TxConsumeIndex = MAC_TXCONSUMEINDEX;
if ( TxConsumeIndex != TxProduceIndex )
{
return ( FALSE );
}
if ( TxProduceIndex == EMAC_TX_DESCRIPTOR_COUNT )
{
/* reach the limit, that probably should never happen */
/* To be tested */
MAC_TXPRODUCEINDEX = 0;
}
if ( TxProduceIndex == EMAC_TX_DESCRIPTOR_COUNT )
{
TxProduceIndex = 0;
}
MAC_TXPRODUCEINDEX = TxProduceIndex; /* transmit now */
EMAC_TxEnable();
}
else
{
/* last fragment */
*tx_desc_addr = (DWORD)(EMACBuf + i * EMAC_BLOCK_SIZE);
/* set TX descriptor control field */
*(tx_desc_addr+1) = (DWORD)(EMAC_TX_DESC_INT | EMAC_TX_DESC_LAST |
(templen -1) );
TxProduceIndex++; /* transmit now */
EMAC_TxEnable();
if ( TxProduceIndex == EMAC_TX_DESCRIPTOR_COUNT )
{
TxProduceIndex = 0;
}
MAC_TXPRODUCEINDEX = TxProduceIndex; /* transmit now */
break;
}
}
}
else
{
tx_desc_addr = (DWORD *)(TX_DESCRIPTOR_ADDR + TxProduceIndex * 8);
/* descriptor status needs to be checked first */
*tx_desc_addr = (DWORD)(EMACBuf);
/* set TX descriptor control field */
*(tx_desc_addr+1) = (DWORD)(EMAC_TX_DESC_INT | EMAC_TX_DESC_LAST |
(length -1));
TxProduceIndex++; /* transmit now */
EMAC_TxEnable();
if ( TxProduceIndex == EMAC_TX_DESCRIPTOR_COUNT )
{
TxProduceIndex = 0;
}
MAC_TXPRODUCEINDEX = TxProduceIndex;
}
return ( TRUE );
}
/
***********************************************************************e
nd of emac.c
***********************************************************************/
/***********************************************************************
crc32.c file
***********************************************************************/
crc_in = *pCRC;
poly = 0xEDB88320L;
entry = (crc_in ^ ((DWORD) val8)) & 0xFF;
for (i = 0; i < 8; i++)
{
if (entry & 1)
entry = (entry >> 1) ^ poly;
else
entry >>= 1;
}
crc_out = ((crc_in>>8) & 0x00FFFFFF) ^ entry;
*pCRC = crc_out;
return;
}
// CRC buffer
DWORD crc32_bfr(void *pBfr, DWORD size)
{
DWORD crc32;
BYTE *pu8;
crc32_init(&crc32);
pu8 = (BYTE *) pBfr;
while (size-- != 0)
{
crc32_add(&crc32, *pu8);
pu8++ ;
}
crc32_end(&crc32);
return ( crc32 );
}
// calculate CRC
DWORD do_crc_behav( long long Addr )
{
/* state variables */
int crc;
/* declare temporary variables */
int q0, q1, q2, q3;
/* loop variables */
int i, j, d;
/* calculate CRC */
crc = 0xFFFFFFFF;
/* do for each byte */
for (i = 5; i >= 0; i--)
{
d = Addr >> (i * 8);
for (j = 0; j < 2; j++)
{ /* calculate temporary variables */
/* bits: 26,23,22,16,12,11,10,8,7,5,4,2,1,0 */
q3 = (((crc >> 28) ^ (d >> 3)) & 0x00000001) ? 0x04C11DB7 : 0x00000000;
/* bits: 27,24,23,17,13,12,11,9,8,6,5,3,2,1 */
q2 = (((crc >> 29) ^ (d >> 2)) & 0x00000001) ? 0x09823B6E : 0x00000000;
/* bits: 28,25,24,18,14,13,12,10,9,7,6,4,3,2 */
q1 = (((crc >> 30) ^ (d >> 1)) & 0x00000001) ? 0x130476DC : 0x00000000;
/* bits: 29,26,25,19,15,14,13,11,10,8,7,5,4,3 */
q0 = (((crc >> 31) ^ d) & 0x00000001) ? 0x2608EDB8 : 0x00000000;
crc = (crc << 4) ^ q3 ^ q2 ^ q1 ^ q0; /* do crc */
d >>= 4; /* shift data */
} }
return ( crc ); }
/
************************************************************************
*****
* emac.h: Header file for NXP LPC230x Family Microprocessors
***********************************************************************/
#ifndef __EMAC_H
#define __EMAC_H
/* Test Register */
#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */
#define TEST_TST_PAUSE 0x00000002 /* Test Pause */
#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */
/* Command Register */
#define CR_RX_EN 0x00000001 /* Enable Receive */
#define CR_TX_EN 0x00000002 /* Enable Transmit */
#define CR_REG_RES 0x00000008 /* Reset Host Registers */
#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */
#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */
#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */
#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */
#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */
#define CR_RMII 0x00000200 /* Reduced MII Interface */
#define CR_FULL_DUP 0x00000400 /* Full Duplex */
/* Status Register */
#define SR_RX_EN 0x00000001 /* Enable Receive */
#define SR_TX_EN 0x00000002 /* Enable Transmit */
/* Below is the Micrel PHY definition used for IAR LPC23xx and
Embedded Artists LPC24xx board. */
#define MIC_PHY_RXER_CNT 0x0015
#define MIC_PHY_INT_CTRL 0x001B
#define MIC_PHY_LINKMD_CTRL 0x001D
#define MIC_PHY_PHY_CTRL 0x001E
#define MIC_PHY_100BASE_PHY_CTRL 0x001F
/* BMCR setting */
#define BMCR_RESET 0x8000
#define BMCR_LOOPBACK 0x4000
#define BMCR_SPEED_100 0x2000
#define BMCR_AN 0x1000
#define BMCR_POWERDOWN 0x0800
#define BMCR_ISOLATE 0x0400
#define BMCR_RE_AN 0x0200
#define BMCR_DUPLEX 0x0100
/* BMSR setting */
#define BMSR_100BE_T4 0x8000
#define BMSR_100TX_FULL 0x4000
#define BMSR_100TX_HALF 0x2000
#define BMSR_10BE_FULL 0x1000
#define BMSR_10BE_HALF 0x0800
#define BMSR_AUTO_DONE 0x0020
#define BMSR_REMOTE_FAULT 0x0010
#define BMSR_NO_AUTO 0x0008
#define BMSR_LINK_ESTABLISHED 0x0004
#define MII_BMSR_TIMEOUT 0x1000000
/* EMAC MODULE ID */
#define PHILIPS_EMAC_MODULE_ID ((0x3902 << 16) | 0x2000)
#define TX_DESCRIPTOR_ADDREMAC_DESCRIPTOR_ADDR
#define TX_STATUS_ADDR (EMAC_DESCRIPTOR_ADDR +
TX_DESCRIPTOR_SIZE)
#define RX_DESCRIPTOR_ADDR(TX_STATUS_ADDR + TX_STATUS_SIZE)
#define RX_STATUS_ADDR (RX_DESCRIPTOR_ADDR +
RX_DESCRIPTOR_SIZE)
#define EMAC_RX_BLOCK_NUM 5
#define TOTAL_EMAC_BLOCK_NUM 10
#define EMAC_TX_BUFFER_ADDREMAC_RAM_ADDR
#define EMAC_RX_BUFFER_ADDR (EMAC_RAM_ADDR +
EMAC_BLOCK_SIZE * EMAC_TX_BLOCK_NUM)