18 #include "../../board.h"
20 #if BOARD == BOARD_EA4357
25 #include "lpc43xx_scu.h"
26 #include "lpc43xx_rgu.h"
28 #define TIMEOUT 100000
30 static unsigned short *rptr;
31 static unsigned short *tptr;
33 static unsigned int TxDescIndex = 0;
34 static unsigned int RxDescIndex = 0;
37 static void write_PHY (
unsigned int PhyReg,
unsigned short Value) {
42 while(LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY);
43 LPC_ETHERNET->MAC_MII_ADDR = (DP83848C_DEF_ADR<<11) | (PhyReg<<6) | GMII_WRITE;
44 LPC_ETHERNET->MAC_MII_DATA = Value;
45 LPC_ETHERNET->MAC_MII_ADDR |= GMII_BUSY;
48 for (tout = 0; tout < MII_WR_TOUT; tout++) {
49 if ((LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY) == 0) {
53 if (tout == MII_WR_TOUT)
59 static unsigned short read_PHY (
unsigned int PhyReg) {
61 unsigned int tout, val;
64 while(LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY);
65 LPC_ETHERNET->MAC_MII_ADDR = (DP83848C_DEF_ADR<<11) | (PhyReg<<6) | GMII_READ;
66 LPC_ETHERNET->MAC_MII_ADDR |= GMII_BUSY;
69 for (tout = 0; tout < MII_RD_TOUT; tout++) {
70 if ((LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY) == 0) {
74 if (tout == MII_RD_TOUT)
76 val = LPC_ETHERNET->MAC_MII_DATA;
82 void rx_descr_init (
void)
86 for (i = 0; i < NUM_RX_DESC; i++) {
87 RX_DESC_STAT(i) = OWN_BIT;
88 RX_DESC_CTRL(i) = ETH_FRAG_SIZE;
89 RX_BUFADDR(i) = RX_BUF(i);
90 if (i == (NUM_RX_DESC-1))
91 RX_DESC_CTRL(i) |= RX_END_RING;
95 LPC_ETHERNET->DMA_REC_DES_ADDR = RX_DESC_BASE;
100 void tx_descr_init (
void)
104 for (i = 0; i < NUM_TX_DESC; i++) {
110 for (i = 0; i < NUM_TX_DESC; i++) {
111 TX_DESC_STAT(i) = TX_LAST_SEGM | TX_FIRST_SEGM;
113 TX_BUFADDR(i) = TX_BUF(i);
114 if (i == (NUM_TX_DESC-1))
115 TX_DESC_STAT(i) |= TX_END_RING;
119 LPC_ETHERNET->DMA_TRANS_DES_ADDR = TX_DESC_BASE;
129 int id1, id2, tout, regv;
130 unsigned phy_in_use = 0;
134 scu_pinmux(0xC ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);
135 scu_pinmux(0x1 ,17 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);
136 scu_pinmux(0x1 ,18 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);
137 scu_pinmux(0x1 ,20 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);
138 scu_pinmux(0x1 ,19 , (MD_PLN | MD_EZI | MD_ZI), FUNC0);
141 scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC6);
143 scu_pinmux(0x1 ,15 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);
144 scu_pinmux(0x0 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC2);
147 scu_pinmux(0x9 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);
150 scu_pinmux(0x9 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);
153 scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC7);
156 scu_pinmux(0xC ,1 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3);
157 scu_pinmux(0x1 ,17 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3);
158 scu_pinmux(0x1 ,18 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3);
159 scu_pinmux(0x1 ,20 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3);
160 scu_pinmux(0x1 ,19 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC0);
162 scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC6);
163 scu_pinmux(0x1 ,15 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3);
164 scu_pinmux(0x0 ,0 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC2);
170 scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC7);
174 #if MII // check MUXING for new Eagle...
176 scu_pinmux(0x9 ,3 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);
179 scu_pinmux(0x9 ,2 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);
181 scu_pinmux(0xC ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);
184 scu_pinmux(0x9 ,4 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);
187 scu_pinmux(0x9 ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);
190 scu_pinmux(0xC ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);
193 scu_pinmux(0x9 ,6 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);
195 LPC_CREG->CREG6 |= RMII_SELECT;
199 RGU_SoftReset(RGU_SIG_ETHERNET);
201 if (LPC_RGU->RESET_ACTIVE_STATUS0 & (1<<ETHERNET_RST))
205 LPC_ETHERNET->DMA_BUS_MODE |= DMA_SOFT_RESET;
206 while(LPC_ETHERNET->DMA_BUS_MODE & DMA_SOFT_RESET);
209 write_PHY (PHY_REG_BMCR, PHY_BMCR_RESET);
212 for (tout = 0; tout < TIMEOUT; tout++) {
213 regv = read_PHY (PHY_REG_BMCR);
214 if (!(regv & PHY_BMCR_RESET)) {
221 id1 = read_PHY (PHY_REG_IDR1);
222 id2 = read_PHY (PHY_REG_IDR2);
223 if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) {
224 phy_in_use = DP83848C_ID;
226 else if (((id1 << 16) | (id2 & 0xFFF0)) == LAN8720_ID) {
227 phy_in_use = LAN8720_ID;
230 if (phy_in_use != 0) {
233 write_PHY (PHY_REG_RBR, 0x20);
237 write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
239 for (tout = 0; tout < TIMEOUT; tout++) {
240 regv = read_PHY (PHY_REG_BMSR);
241 if (regv & PHY_AUTO_NEG_DONE) {
251 for (tout = 0; tout < TIMEOUT; tout++) {
252 regv = read_PHY (PHY_REG_STS);
253 if (regv & LINK_VALID_STS) {
260 switch (phy_in_use) {
264 if (regv & FULL_DUP_STS) {
266 LPC_ETHERNET->MAC_CONFIG |= MAC_DUPMODE;
270 if (~(regv & SPEED_10M_STS)) {
272 LPC_ETHERNET->MAC_CONFIG |= MAC_100MPS;
301 regv = read_PHY (PHY_REG_SCSR);
305 LPC_ETHERNET->MAC_CONFIG |= MAC_DUPMODE;
311 LPC_ETHERNET->MAC_CONFIG |= MAC_100MPS;
320 LPC_ETHERNET->MAC_ADDR0_HIGH = (MYMAC_6 << 8) | MYMAC_5;
321 LPC_ETHERNET->MAC_ADDR0_LOW = (MYMAC_4 << 24) | (MYMAC_3 << 16) | (MYMAC_2 << 8) | MYMAC_1;
328 LPC_ETHERNET->MAC_FRAME_FILTER = MAC_PROMISCUOUS | MAC_RECEIVEALL;
331 LPC_ETHERNET->MAC_CONFIG |= (MAC_TX_ENABLE | MAC_RX_ENABLE);
337 LPC_ETHERNET->DMA_OP_MODE |= (DMA_SS_TRANSMIT | DMA_SS_RECEIVE );
344 unsigned short ReadFrame_EMAC(
void)
353 unsigned short SwapBytes(
unsigned short Data)
355 return (Data >> 8) | (Data << 8);
362 unsigned short ReadFrameBE_EMAC(
void)
364 unsigned short ReturnValue;
366 ReturnValue = SwapBytes (*rptr++);
367 return (ReturnValue);
376 void CopyFromFrame_EMAC(
void *Dest,
unsigned short Size)
378 unsigned short * piDest;
382 *piDest++ = ReadFrame_EMAC();
387 *(
unsigned char *)piDest = (
char)ReadFrame_EMAC();
394 void DummyReadFrame_EMAC(
unsigned short Size)
405 unsigned short StartReadFrame(
void) {
406 unsigned short RxLen;
408 if ((RX_DESC_STAT(RxDescIndex) & OWN_BIT) == 0) {
409 RxLen = (RX_DESC_STAT(RxDescIndex) >> 16) & 0x03FFF;
410 rptr = (
unsigned short *)RX_BUFADDR(RxDescIndex);
417 void EndReadFrame(
void) {
419 RX_DESC_STAT(RxDescIndex) = OWN_BIT;
421 if (RxDescIndex == NUM_RX_DESC)
425 unsigned int CheckFrameReceived(
void) {
427 if ((RX_DESC_STAT(RxDescIndex) & OWN_BIT) == 0)
435 void RequestSend(
unsigned short FrameSize)
437 tptr = (
unsigned short *)TX_BUFADDR(TxDescIndex);
438 TX_DESC_CTRL(TxDescIndex) = FrameSize;
444 unsigned int Rdy4Tx(
void)
451 void WriteFrame_EMAC(
unsigned short Data)
461 void CopyToFrame_EMAC(
void *Source,
unsigned int Size)
463 unsigned short * piSource;
467 Size = (Size + 1) & 0xFFFE;
469 WriteFrame_EMAC(*piSource++);
472 TX_DESC_STAT(TxDescIndex) |= OWN_BIT;
473 LPC_ETHERNET->DMA_TRANS_POLL_DEMAND = 1;
475 if (TxDescIndex == NUM_TX_DESC)