好久没更新blog了,有点忙也有点懒^_^。自从上次十分简单地移植dm9000到试验箱后,就一直没关注具体的细节,直到这几天自己移植dm9000ae的驱动时才发现网友遇到的问题。u-boot自带的dm9000驱动是针对dm9000,一款比较老的isa接口芯片,而现在一般用的是dm9000ae升级版芯片。这个升级并非完全兼容,稍不注意,就会有莫名其妙的错误。

      1.超时问题,症状为不断地出现T。通过wireshark的抓包,有发送也有返回的包,但返回的包并没有被处理,直到T,然后重新发包。对比Linux的驱动,在收包前Linux会有
               ior(db,0xf4);
               ior(db,0xf5);
这两个动作。添加后问题解决。在这里说是缓冲区要复位,但我对比dm9000和dm9000ae的datasheet,都是说IMR位7置一时,缓冲区满时会自动复位。看不出dm9000和dm9000ae有什么差别...

      2.tftp传送失败。传送uImage,bootm后出现"Bad Data CRC"。wireshark抓包,发送和接收都正常。通过cmp与串口传过来的uImage对比,发现每1468个字节后会有8个字节的丢失。打开驱动的debug,print收到的包,发现收到的数据都正确,只不过包的最大长度为1460,后面的8个字节在随后的包中被上层丢弃了。同时,wireshark显示tftp的分包大小为1468,修改tftp的最大分包大小为1460,问题解决。

      3.每次接收都先停顿一个T。抓包,发现第一个arp包没有被抓到,即dm9000还没正常工作。而且每次接收都会等待一个T,即接收完后dm9000被停止。讲eth_init添加到board的初始化并注释eth_halt的内容,一切搞定^_^。

        总结很轻松,过程总是充满辛酸...经过半年的coding,分析能力也有了很大的提高。另外,工作很忙,希望大家不要问我要代码^_^

Tag: 工作

分页共1页 1