学者之家电子论坛--打造电子工程师共同致富的平台's Archiver

aokikyon 发表于 2009-7-31 09:59

[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&nbsp;&nbsp; 0x18800300<br/>//#define CS8900_BUS16&nbsp;&nbsp; 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 &lt; 6; i++)<br/>&nbsp;&nbsp; ((u16 *) bd-&gt;bi_enetaddr)[i] = read_srom_word(i);<br/>*/</p><p>添加以下内容,后来用了1.3.3的dm9000x.c文件,发现已经有了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *s, *e;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = getenv ("ethaddr");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 6; ++i) <br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bd-&gt;bi_enetaddr[i] = s ?<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simple_strtoul (s, &amp;e, 16) : 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = (*e) ? e + 1 : e;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<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) &amp; 0x20)) { /* autonegation complete bit */<br/>&nbsp;&nbsp; udelay(1000);<br/>&nbsp;&nbsp; i++;<br/>&nbsp;&nbsp; if (i == 10000) {<br/>&nbsp;&nbsp;&nbsp; printf("could not establish link\n");<br/>&nbsp;&nbsp;&nbsp; return 0;<br/>&nbsp;&nbsp; }<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&nbsp;&nbsp; address set-up<br/>#define CS8900_Tcos (0x0) // 4clk&nbsp;&nbsp; chip selection set-up<br/>#define CS8900_Tacc (0x7) // e 14clk access cycle<br/>#define CS8900_Tcoh (0x0) // 1clk&nbsp;&nbsp; chip selection hold<br/>#define CS8900_Tah (0x0) // 4clk&nbsp;&nbsp; address holding time<br/>#define CS8900_Tacp (0x0) // 6clk&nbsp;&nbsp; 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 &amp;= ~(0xf &lt;&lt; 4);<br/>SROM_BW_REG |= (1&lt;&lt;7) | (1&lt;&lt;6) | (1&lt;&lt;4);<br/>SROM_BC1_REG = ((CS8900_Tacs&lt;&lt;28)+(CS8900_Tcos&lt;&lt;24)+(CS8900_Tacc&lt;&lt;16)+(CS8900_Tcoh&lt;&lt;12)+(CS8900_Tah&lt;&lt;8)+(CS8900_Tacp&lt;&lt;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/>&nbsp;&nbsp; return 0;</font></p><p><font color="#0000ff">/* Status check: this byte must be 0 or 1 */<br/>if (rxbyte &gt; 1) {<br/>&nbsp;&nbsp; DM9000_iow(DM9000_RCR, 0x00); /* Stop Device */<br/>&nbsp;&nbsp; DM9000_iow(DM9000_ISR, 0x80); /* Stop INT request */<br/>&nbsp;&nbsp; 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 &amp; Get status/length */<br/>DM9000_outb(DM9000_MRCMD, DM9000_IO);</font></p><p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp; /* */<br/>RxStatus = DM9000_inw(DM9000_DATA);<br/>RxLen = DM9000_inw(DM9000_DATA);</font></p><p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp; /* */<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 &lt; tmplen; i++)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp; ((u16 *) rdptr)[i] = DM9000_inw(DM9000_DATA);<br/>&nbsp;&nbsp;&nbsp; //printf("%d ",((u16 *) rdptr)[i]);<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp; /* */<br/>if ((RxStatus &amp; 0xbf00) || (RxLen &lt; 0x40)<br/>&nbsp;&nbsp;&nbsp;&nbsp; || (RxLen &gt; DM9000_PKT_MAX)) {<br/>&nbsp;&nbsp; if (RxStatus &amp; 0x100) {<br/>&nbsp;&nbsp;&nbsp; printf("rx fifo error\n");<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; if (RxStatus &amp; 0x200) {<br/>&nbsp;&nbsp;&nbsp; printf("rx crc error\n");<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; if (RxStatus &amp; 0x8000) {<br/>&nbsp;&nbsp;&nbsp; printf("rx length error\n");<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; if (RxLen &gt; DM9000_PKT_MAX) {<br/>&nbsp;&nbsp;&nbsp; printf("rx length too big\n");<br/>&nbsp;&nbsp;&nbsp; dm9000_reset();<br/>&nbsp;&nbsp; }<br/>} else {</font></p><p><font color="#0000ff">&nbsp;&nbsp; /* Pass to upper layer */<br/>&nbsp;&nbsp; DM9000_DBG("passing packet to upper layer\n");<br/>&nbsp;&nbsp; NetReceive(NetRxPackets[0], RxLen);<br/>&nbsp;&nbsp; //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/>**&nbsp;&nbsp;&nbsp; UT-S3C6410 Nand boot v0.18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **<br/>**&nbsp;&nbsp;&nbsp; ShenZhen Urbetter Technology&nbsp;&nbsp;&nbsp; **<br/>**&nbsp;&nbsp;&nbsp; </font><a href="http://www.urbetter.com/"><font color="#0000ff">Http://www.urbetter.com</font></a><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **<br/>****************************************</font></p><p><font color="#0000ff">CPU:&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="mailto:S3C6410@532MHz"><font color="#0000ff">S3C6410@532MHz</font></a><br/><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) <br/>Board:&nbsp;&nbsp; SMDK6410<br/>DRAM:&nbsp;&nbsp;&nbsp; 128 MB<br/>Flash:&nbsp;&nbsp; 0 kB<br/>NAND:&nbsp;&nbsp;&nbsp; 256 MB <br/>In:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serial<br/>Out:&nbsp;&nbsp;&nbsp;&nbsp; serial<br/>Err:&nbsp;&nbsp;&nbsp;&nbsp; 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/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #################################################################<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #################################################################<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #################################################################<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #################################################################<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ##############################<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]

涛行九天 发表于 2009-7-31 11:26

<p>楼主暴强啊,支持!</p><p></p><p>貌似少个图片啊</p>

页: [1]

Powered by Discuz! Archiver 7.1  © 2001-2009 Comsenz Inc.

302 Found

302 Found


nginx/1.8.0