我照着技创的极品arm做了一块板子,s3c2440的,网片为dm9000ae,cpu可以识别读出DM9000的id,但是与pc相连时出现:<br />U-Boot 1.1.2 (Jan 2 2008 - 10:49:23)<br /><br /><br />U-Boot code: 33C00000 -> 33C2B19C BSS: -> 33C64BCC<br /><br />RAM Configuration:<br /><br />Bank #0: 30000000 64 MB<br /><br />Get flash bank 0 size @ 0x0<br /><br />Total Flash bank's sizes: 0x200000<br /><br />protect monitor 2b19c bytes @ address 0<br /><br />Flash: 2 MB<br /><br />NAND:Flash chip found:<br /><br /> Manufacturer ID: 0xEC, Chip ID: 0x76 (Samsung unknown 64Mb)<br /><br />1 flash chips found. Total nand_chip size: 64 MB<br /><br />64 MB<br /><br />*** Warning - bad CRC, using default environment<br /><br /><br />Silicon Motion 501 not detected<br /><br />In: serial<br /><br />Out: serial<br /><br />Err: serial<br /><br />Found DM9000 ID:90000a46 at address 10000000, ethaddr = 08:00:3e:26:0a:5b!<br /><br />DM9000 work in 16 bus width<br /><br />Not link of ethernet<br /><br /><br />SD Initialize fail..<br /><br /><br />Hit any key to stop autoboot: 0 <br /><br />MDS522C@Xlongtech # set ipaddr 192.168.3.15<br /><br />MDS522C@Xlongtech # set serverip 192.168.3.96<br /><br />MDS522C@Xlongtech # t 30038000 eboot.nb0<br /><br />DM9000 work in 16 bus width<br /><br />Not link of ethernet<br /><br />TFTP from server 192.168.3.96; our IP address is 192.168.3.15<br /><br />Filename 'eboot.nb0'.<br /><br />Load address: 0x30038000<br /><br />Loading: T T T T T T T T T T <br /><br />Retry count exceeded; starting again<br /><br />TFTP from server 192.168.3.96; our IP address is 192.168.3.15<br /><br />Filename 'eboot.nb0'.<br /><br />Load address: 0x30038000<br /><br />Loading: T T T T <br />一直重复,感觉与pc没有连接上,拔掉网线的现象与这个一摸一样,驱动程序如下:<br />#include <common.h><br />#include <command.h><br />#include <net.h><br /><br />#ifdef CONFIG_DRIVER_DM9000<br /><br />#if (CONFIG_COMMANDS & CFG_CMD_NET)<br />#define DM9000_VID_L 0x28<br />#define DM9000_VID_H 0x29<br />#define DM9000_PID_L 0x2A<br />#define DM9000_PID_H 0x2B<br />#define DM9000_ID 0x90000A46<br />#define DM9000_INT_MII 0x00<br />#define DM9000_PPTR *(volatile u16 *)(DM9000_BASE)<br />#define DM9000_PDATA *(volatile u16 *)(DM9000_BASE + 4)<br />static unsigned char ior(int reg);<br />static int polling_times;<br /><br /><br /><br />/* edit by davicom */<br />static void eth_mem_test (void)<br />{<br /> u8 i;<br /> u16 j , k ;<br /> <br /> iow(0x00, 3);<br /> udelay(50); /* delay 100us */<br /> iow(0x00, 2);<br /> <br /> iow(0xff , 0x00); <br /><br /> printf("\n <DM9000A> REG R/W TEST ");<br /> <br /> for(i = 0; i < 7; i++)<br /> {<br /> iow(0x16 + i, (0x5a + i));<br /> if(ior(0x16 + i) != (0x5a + i)) break;<br /> iow(0x16 + i, 0x00);<br /> }<br /> <br /> if(i != 7)<br /> printf("===> REG R/W FALSE ");<br /> else<br /> printf("===> REG R/W PASS ");<br /> <br /> for(i = 0 ; i < 0x4 ; i++)<br /> {<br /> //if((i * 0x1000) != ((ior(0xf4)<<8)+ior(0xf5)))<br /> //{<br /> // printf("\n io mode error or data jump error");<br /> // break;<br /> //}<br /> <br /> k = 0xaa55;<br /> printf("\n <DM9000A> FIFO TEST R: %02x%02x W: %02x%02x ",<br /> ior(0xf5) , ior(0xf4) , ior(0xfa) , ior(0xfb));<br /> <br /> DM9000_PPTR = 0xf8;<br /> for(j = 0 ; j < 0x1000 ; j += 2)<br /> {<br /> k -= 0x0303;<br /> DM9000_PDATA = k;<br /> }<br /> <br /> DM9000_PPTR = 0xf0;<br /> k = DM9000_PDATA;<br /> k = DM9000_PDATA;<br /> <br /> k = 0xaa55;<br /> DM9000_PPTR = 0xf2;<br /> for(j = 0 ; j < 0x1000 ; j += 2)<br /> {<br /> k -= 0x0303;<br /> if (DM9000_PDATA != k)break;<br /> }<br /> <br /> if(j != 0x1000)<br /> {<br /> printf("===> FIFO TEST R/W FALSE ");<br /> break;<br /> }<br /> else<br /> printf("===> FIFO TEST R/W PASS ");<br /> }<br />}<br />/* edit by davicom */<br /><br />/* packet page register access functions */<br />static u32 GetDM9000ID(void)<br />{<br /> u32 id_val;<br /><br /> DM9000_PPTR = DM9000_PID_H;<br /> id_val = (DM9000_PDATA & 0xff) << 8;<br /> DM9000_PPTR = DM9000_PID_L;<br /> id_val+= (DM9000_PDATA & 0xff);<br /> id_val = id_val << 16;<br /> <br /> DM9000_PPTR = DM9000_VID_H;<br /> id_val += (DM9000_PDATA & 0xff) << 8;<br /> DM9000_PPTR = DM9000_VID_L;<br /> id_val += (DM9000_PDATA & 0xff);<br /> <br /><br /> return id_val;<br />}<br /><br />static unsigned short get_reg (int regno)<br />{<br /> DM9000_PPTR = regno;<br /> return (unsigned short) DM9000_PDATA;<br />}<br /><br /><br />static void put_reg (int regno, unsigned short val)<br />{<br /> DM9000_PPTR = regno;<br /> DM9000_PDATA = val;<br />}<br /><br />static void iow(int reg, u8 value)<br />{<br /> DM9000_PPTR = reg;<br /> DM9000_PDATA = value & 0xff;<br />}<br /><br />static unsigned char ior(int reg)<br />{<br /> DM9000_PPTR = reg;<br /> return DM9000_PDATA & 0xff;<br />}<br /><br />static void eth_reset (void)<br />{<br /> int IoMode;<br /> u8 tmp;<br /> //printf("---->eth_reset \n");<br /> iow(0x1f, 0x00);/* Enable PHY , Let GPIO0 output value = 0*/<br /> udelay(50);<br /><br /> iow(0, 3);/* register 0 set 1 in order to reset, auto clean after 10us*/<br /> udelay(50);/* delay 100us */<br /> iow(0, 3);/* register 0 set 1 in order to reset, auto clean after 10us*/<br /> udelay(50);/* delay 100us */<br /><br /> IoMode = ior(0xfe) >> 6; /* ISR bit7:6 keeps I/O mode */<br /> if(!IoMode)<br /> printf("DM9000 work in 16 bus width\n");<br /> else if(IoMode == 2)<br /> printf("DM9000 work in 8 bus width\n");<br /> else if(IoMode == 1)<br /> printf("DM9000 work in 32 bus width\n");<br /> else<br /> printf("DM9000 work in wrong bus width, error\n");<br /> iow(0, 0);<br /> iow(0x8, 0x3f);/*Back Pressure Threshold Register*/<br /> iow(0x2f, 0);/*Special Mode*/<br /> iow(0x1, 0x2c);/*Clear Wakeup, TX1 and TX2 complete status*/<br /> //iow(0xfe, 0x0f);<br /> iow(0x5, 0x31);/* enable rx fuction */<br /> iow(0xff, 0x80); <br /> //iow(0x1e, 0x01); /* Let GPIO0 output */<br /> //iow(0xff, 0x80); /* disable interrupt and sram read/write point auto return*/<br /> //iow(0x01, 0xc); /* clear TX status */<br /> //iow(0x5, 0x33); /* enable rx fuction, note: must set promiscuous mode */<br /> //iow(0x5, 0x31); /* enable rx fuction */<br /> //ior(0x6);<br /> //iow(0x2, 1); /* enable tx fuction */<br /> IoMode = ior(0x01);<br /> if(IoMode & 0x40)<br /> printf("Link on ethernet at:%d Mbps\n", (IoMode & 0x80) ? 10:100);<br /> else<br /> printf("Not link of ethernet\n");<br /> //printf("<---- eth_reset \n");<br />}<br /><br /><br />void DM9000_get_enetaddr (uchar * addr)<br />{<br /> int i, oft;<br /> unsigned char env_enetaddr[6];<br /> char *tmp = getenv ("ethaddr");<br /> char *tmp1 = tmp;<br /> char *end;<br /> u32 ID;<br /><br /> for (i=0; i<6; i++) {<br /> env_enetaddr = tmp ? simple_strtoul(tmp, &end, 16) : 0;<br /> if (tmp)<br /> tmp = (*end) ? end+1 : end;<br /> }<br /> memcpy (addr, env_enetaddr, 6);<br /> ID = GetDM9000ID();<br /> if ( ID != DM9000_ID){<br /> printf("not found the dm9000\n");<br /> return;}<br /> printf("Found DM9000 ID:%x at address %x, ethaddr = %s!\n", ID, DM9000_BASE, tmp1);<br /> eth_reset ();<br /> for (i = 0, oft = 0x10; i < 6; i++, oft++)<br /> iow(oft, addr);<br /> iow(0x1d, 0x80);/*receive broadcast packets*/<br /> return;<br />}<br /><br />void eth_halt (void)<br />{<br /> GetDM9000ID();<br />}<br /><br />int eth_init (bd_t * bd)<br />{<br /> //eth_mem_test();<br /> eth_reset();<br /> polling_times=0;<br /> return 0;<br />}<br /><br />/* Get a data block via Ethernet */<br />extern int eth_rx (void)<br />{<br /> int i;<br /> unsigned short rxlen;<br /> unsigned short *addr;<br /> unsigned short status;<br /> u8 RxRead;<br /> u8 *tmp;<br /> polling_times++;<br /> //printf("Read address=0x%04x %04x\n",ior(0xf4), ior(0xf5)); <br /> ior(0xf4); ior(0xf5); <br /> RxRead = ior(0xf0);<br /> RxRead = (DM9000_PDATA) & 0xff;<br /> RxRead = (DM9000_PDATA) & 0xff;<br /> RxRead = (DM9000_PDATA) & 0xff;<br /> RxRead = (DM9000_PDATA) & 0xff;<br /> RxRead = (DM9000_PDATA) & 0xff;<br /> RxRead = (DM9000_PDATA) & 0xff;<br /><br /> //printf("Read address=0x%04x %04x\n",ior(0xfa), ior(0xfb)); <br /> //udelay(1000);<br /> if (RxRead != 1) /* no data */ <br /> return 0;<br /><br /> DM9000_PPTR = 0xf2; /* set read ptr ++ */<br /><br /> status = DM9000_PDATA; /* get stat */<br /> rxlen = DM9000_PDATA; /* get len */<br /> //printf("rxlen = %d\n", rxlen);<br /> if (rxlen > PKTSIZE_ALIGN + PKTALIGN)<br /> printf ("packet too big! %d %d\n", rxlen, PKTSIZE_ALIGN + PKTALIGN);<br /><br /> for (addr = (unsigned short *) NetRxPackets[0], i = rxlen >> 1; i > 0; i--)<br /> *addr++ = DM9000_PDATA;<br /> if (rxlen & 1)<br /> *addr = DM9000_PDATA;<br /><br /> /* Pass the packet up to the protocol layers. */<br /> NetReceive (NetRxPackets[0], rxlen);<br /><br /> return rxlen;<br />}<br /><br />/* Send a data block via Ethernet. */<br />extern int eth_send (volatile void *packet, int length)<br />{<br /> volatile unsigned short *addr;<br /> int tmo;<br /> u8 TxStatus;<br /> int length1 = length;<br /> int IoMode;<br />retry:<br /> TxStatus = ior(0x01);<br /> TxStatus = TxStatus & 0xc;<br />#if 0<br /><br /> /* Test to see if the chip has allocated memory for the packet */<br /> if (!TxStatus) {<br /> printf ("unable to send packet; retrying... %d\n", TxStatus);<br /> for (tmo = get_timer (0) + CFG_HZ; get_timer (0) < tmo;);<br /> /*NOP*/;<br /> IoMode = ior(0x01);<br /> if(IoMode & 0x40)<br /> eth_reset ();<br /> goto retry;<br /> }<br />#endif<br /> //printf("polling times = %d\n",polling_times); <br /> DM9000_PPTR = 0xf8; /* data copy ready set */<br /> /* copy data */<br /> for (addr = packet; length > 0; length -= 2)<br /> {<br /> //printf("[%02x][%02x]", *(u8 *)addr, *((u8 *)addr + 1)); <br /> DM9000_PDATA = *addr++;<br /> }<br /> //printf("\n");<br /> iow(0xfd, (length1 >> 8) & 0xff); /*set transmit leng */<br /> iow(0xfc, length1 & 0xff);<br /> /* start transmit */<br /> iow(0x02, 1);<br /> polling_times=0;<br /> return 0;<br />}<br />#endif /* COMMANDS & CFG_NET */<br /><br />#endif /* CONFIG_DRIVER_DM9000 */<br />电路检查没有发现问题!!<br />希望各位大虾帮看看啊!!!<br />谢谢了!!! |
|