[6410]移植dm9000ae驱动到u-boot
<p><a href="http://hi.baidu.com/aokikyon/blog/item/e044b81071097d08203f2ee3.html">http://hi.baidu.com/aokikyon/blog/item/e044b81071097d08203f2ee3.html</a></p><p></p><p></p><p>刚到手的友坚6410开发板的u-boot竟然没有网卡驱动,无语,自己做吧。<br/>u-boot版本1.1.6</p><p>(1)在smdk6410.h中注释掉CS8900信息,添加DM9000信息<br/>注意参考原理图,DM9000使用了CSn1,基地址为18000000</p><p></p><div forimg="1"><img class="blogimg" alt="" src="http://hiphotos.baidu.com/aokikyon/pic/item/e7693fd1646baaf4562c8413.jpg" border="0" small="0"/></div><p>//#define CONFIG_DRIVER_CS8900 0 /* we have a CS8900 on-board */<br/>//#define CS8900_BASE 0x18800300<br/>//#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */<br/>//#endif</p><p><font color="#ff0000">#define CONFIG_DRIVER_DM9000 1<br/>#define CONFIG_DM9000_BASE 0x18000300 //0x20000300<br/>#define DM9000_IO CONFIG_DM9000_BASE<br/>#define DM9000_DATA (CONFIG_DM9000_BASE+4)<br/>#define CONFIG_DM9000_USE_16BIT</font></p><p>(2)编译,测试,出现以下问题,MAC不对<br/>kyon6410 # ping 192.168.0.1<br/>dm9000 not found at 0x0112a9ac id: 0x24242424<br/>MAC: 24:24:24:24:24:24<br/>operating at 10M full duplex mode<br/>rx fifo error<br/>rx crc error<br/>rx length too big</p><p>ARP Retry count exceeded; starting again<br/>rx fifo error<br/>rx crc error<br/>rx length too big</p><p>在dm9000x.c中注释以下内容:</p><p>/* Set Node address */<br/>/* for (i = 0; i < 6; i++)<br/> ((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);<br/>*/</p><p>添加以下内容,后来用了1.3.3的dm9000x.c文件,发现已经有了。<br/> char *s, *e;<br/> s = getenv ("ethaddr");<br/> for (i = 0; i < 6; ++i) <br/>{<br/> bd->bi_enetaddr[i] = s ?<br/> simple_strtoul (s, &e, 16) : 0;<br/> if (s)<br/> s = (*e) ? e + 1 : e;<br/> }<br/>// kyon</p><p><br/>继续测试:</p><p>kyon6410 # ping 192.168.0.1<br/>dm9000 not found at 0x0112a9ac id: 0x24242424<br/>MAC: 00:40:5c:26:0a:5b<br/>operating at 10M full duplex mode<br/>rx fifo error<br/>rx crc error<br/>rx length too big</p><p>ARP Retry count exceeded; starting again<br/>rx fifo error<br/>rx crc error<br/>rx length too big</p><p>MAC地址读出来了,其他还是不对</p><p>然后发现0x18000000写成18000000了,囧</p><p>(3)将地址修改为0x18000000,继续:</p><p><font color="#0000ff">dm9000 i/o: 0x18000300, id: 0x90000a46 <br/>MAC: 00:40:5c:26:0a:5b<br/>operating at 100M full duplex mode</font></p><p>能正确识别网卡,ping不通</p><p>注释以下内容:<br/><font color="#0000ff">#if 0<br/>i = 0;<br/>while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */<br/> udelay(1000);<br/> i++;<br/> if (i == 10000) {<br/> printf("could not establish link\n");<br/> return 0;<br/> }<br/>}<br/>#endif</font></p><p>注释后省去检查网卡的过程,还是不行,tftp貌似只能传一个数据包。</p><p>(4)打开调试宏进行调试,网上还有人可能是bank没有被正确配置为16bit宽度导致问题。<br/>查看smdk6410.c,发现已经正确初始化了CSn1,虽然用的是CS8900的代码:<br/><font color="#0000ff">/* ------------------------------------------------------------------------- */<br/>#define CS8900_Tacs (0x0) // 0clk address set-up<br/>#define CS8900_Tcos (0x0) // 4clk chip selection set-up<br/>#define CS8900_Tacc (0x7) // e 14clk access cycle<br/>#define CS8900_Tcoh (0x0) // 1clk chip selection hold<br/>#define CS8900_Tah (0x0) // 4clk address holding time<br/>#define CS8900_Tacp (0x0) // 6clk page mode access cycle<br/>#define CS8900_PMC (0x0) // normal(1data)page mode configuration</font></p><p><font color="#0000ff">static void cs8900_pre_init(void)<br/>{<br/>SROM_BW_REG &= ~(0xf << 4);<br/>SROM_BW_REG |= (1<<7) | (1<<6) | (1<<4);<br/>SROM_BC1_REG = ((CS8900_Tacs<<28)+(CS8900_Tcos<<24)+(CS8900_Tacc<<16)+(CS8900_Tcoh<<12)+(CS8900_Tah<<8)+(CS8900_Tacp<<4)+(CS8900_PMC));<br/>}</font></p><p>顺便按照资料优化了一下总线时序,dm9000很快的。</p><p><br/>(5)以上是昨晚的调试过程,非常郁闷的回去睡觉了。早上过来想看看mini2440的原理图,看看他们怎么做的。<br/>结果被郁闷到了,原来mini2440使用的是dm9000,我这里的芯片是dm9000ae!两者引脚都不一样!<br/>在网上搜索dm9000ae,发现许多人都是按照dm9000的方法移植,都出现我昨晚的问题,能够识别,ping不通。</p><p>(6)<br/>无奈参考Linux内核中代码,发现Linux的dm9000在rx函数中添加do while循环,于是按照Linux内核源码在u-boot中也添加do while循环。<br/><font color="#0000ff"><font color="#ff0000">do{</font><br/>/* Check packet ready or not */<br/>DM9000_ior(DM9000_MRCMDX); /* Dummy read */<br/>rxbyte = DM9000_inb(DM9000_DATA); /* Got most updated data */<br/>if (rxbyte == 0)<br/> return 0;</font></p><p><font color="#0000ff">/* Status check: this byte must be 0 or 1 */<br/>if (rxbyte > 1) {<br/> DM9000_iow(DM9000_RCR, 0x00); /* Stop Device */<br/> DM9000_iow(DM9000_ISR, 0x80); /* Stop INT request */<br/> DM9000_DBG("rx status check: %d\n", rxbyte);<br/>}<br/>DM9000_DBG("receiving packet\n");</font></p><p><font color="#0000ff">/* A packet ready now & Get status/length */<br/>DM9000_outb(DM9000_MRCMD, DM9000_IO);</font></p><p><font color="#0000ff"> /* */<br/>RxStatus = DM9000_inw(DM9000_DATA);<br/>RxLen = DM9000_inw(DM9000_DATA);</font></p><p><font color="#0000ff"> /* */<br/>DM9000_DBG("rx status: 0x%04x rx len: %d\n", RxStatus, RxLen);</font></p><p><font color="#0000ff">/* Move data from DM9000 */<br/>/* Read received packet from RX SRAM */<br/>tmplen = (RxLen + 1) / 2;<br/>for (i = 0; i < tmplen; i++)<br/> {<br/> ((u16 *) rdptr)[i] = DM9000_inw(DM9000_DATA);<br/> //printf("%d ",((u16 *) rdptr)[i]);<br/> }<br/> /* */<br/>if ((RxStatus & 0xbf00) || (RxLen < 0x40)<br/> || (RxLen > DM9000_PKT_MAX)) {<br/> if (RxStatus & 0x100) {<br/> printf("rx fifo error\n");<br/> }<br/> if (RxStatus & 0x200) {<br/> printf("rx crc error\n");<br/> }<br/> if (RxStatus & 0x8000) {<br/> printf("rx length error\n");<br/> }<br/> if (RxLen > DM9000_PKT_MAX) {<br/> printf("rx length too big\n");<br/> dm9000_reset();<br/> }<br/>} else {</font></p><p><font color="#0000ff"> /* Pass to upper layer */<br/> DM9000_DBG("passing packet to upper layer\n");<br/> NetReceive(NetRxPackets[0], RxLen);<br/> //return RxLen;<br/>}<br/>}<br/><font color="#ff0000">while (rxbyte == DM9000_PKT_RDY);</font><br/>//return 0;</font></p><p><font color="#ff0000">return RxLen;</font></p><p>测试结果:<br/>大部分时候都可以ping通了,因为有调试信息,tftp速度十几k。</p><p>网上还有个建议在tx函数前加入以上内容清空dm9000ae寄存器<br/><font color="#ff0000">DM9000_ior(DM9000_MRRH); <br/>DM9000_ior(DM9000_MRRL);</font><br/>我放在do的前面,貌似也有一定作用</p><p><br/>(7)<br/>每次ping结束后都会进入eth_halt,关闭网络,可能导致传输出现问题,遂屏蔽halt函数内容。<br/><font color="#ff0000">void<br/>eth_halt(void)<br/>{<br/>DM9000_DBG("eth_halt dummy by kyon\n");</font></p><p><font color="#ff0000">/* RESET devie */<br/>//phy_write(0, 0x8000); /* PHY RESET */<br/>//DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */<br/>//DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */<br/>//DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */<br/>}</font></p><p>(8)至此dm9000ae基本能够使用,只是用来加载内核已经足够了。<br/>测试传输速度有1.2MB,很快!</p><p><br/><font color="#0000ff">U-Boot 1.1.6 (Jul 8 2009 - 11:31:24) for SMDK6410</font></p><p><font color="#0000ff">****************************************<br/>** UT-S3C6410 Nand boot v0.18 **<br/>** ShenZhen Urbetter Technology **<br/>** </font><a href="http://www.urbetter.com/"><font color="#0000ff">Http://www.urbetter.com</font></a><font color="#0000ff"> **<br/>****************************************</font></p><p><font color="#0000ff">CPU: </font><a href="mailto:S3C6410@532MHz"><font color="#0000ff">S3C6410@532MHz</font></a><br/><font color="#0000ff"> Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) <br/>Board: SMDK6410<br/>DRAM: 128 MB<br/>Flash: 0 kB<br/>NAND: 256 MB <br/>In: serial<br/>Out: serial<br/>Err: serial<br/>Hit any key to stop autoboot: 0 <br/>dm9000 i/o: 0x18000300, id: 0x90000a46 <br/>MAC: 00:40:5c:26:0a:5b<br/>operating at 100M full duplex mode<br/>TFTP from server 192.168.0.1; our IP address is 192.168.0.4<br/>Filename 'zimage'.<br/>Load address: 0xc0008000<br/>Loading: T #################################################################<br/> #################################################################<br/> #################################################################<br/> #################################################################<br/> #################################################################<br/> ##############################<br/>done<br/>Bytes transferred = 1813092 (1baa64 hex)<br/>Boot with zImage</font></p><p><font color="#0000ff">Starting kernel ...</font></p><p><font color="#0000ff">Uncompressing Linux...................................................................................................................... done, booting the kernel.<br/>Linux version 2.6.24.2 (</font><a href="mailto:fusq@fusq-urbetter"><font color="#0000ff">fusq@fusq-urbetter</font></a><font color="#0000ff">) (gcc version 4.2.2) #343 Sat Jun 20 13:24:05 CST 2009<br/>CPU: ARMv6-compatible processor [410fb766] revision 6 (ARMv7), cr=00c5387f<br/>Machine: SMDK6410</font></p><p><br/>参考文章:<br/><a href="http://weibing.blogbus.com/logs/12146712.html">http://weibing.blogbus.com/logs/12146712.html</a></p><p><a href="http://blog.chinaunix.net/u1/34474/showart_488095.html">http://blog.chinaunix.net/u1/34474/showart_488095.html</a></p>[align=right][color=#000066][此贴子已经被作者于2009-7-31 9:59:53编辑过][/color][/align] <p>楼主暴强啊,支持!</p><p></p><p>貌似少个图片啊</p>
页:
[1]