出现的问题:
1、刚开始,无法发送数据包,开发板向PC机发送读请求tftp包,PC机能收到这个tftp读请求包,但是当PC机向开发板发送tftp包的时候却出现了access volitation。
解决办法:
用uboot的tftp功能进行下载,出现同样的问题(access volitation),ubot的tftp肯定是没有问题的,怀疑是tftp没有配置好,后来进行tftp配置,在自己pc机上进行tftp测试也出现了access volitation这个问题,所以肯定是tftp没有配置好的原因。但是tftp是按照网上一步步来的,按道理应该是没有问题的,后来发现原来有两个地方可以修改tftp的配置,可我两个地方都修改了,且两个地方修改的不一致,因为以前也弄过一次tftp,而上一次的tftp配置和这一次的tftp配置正好用的是不同的方法,一种是先前建立/etc/xinetd.d/tftp配置文件,一种是修改/etc/inetd.conf,所以导致冲突。按照我博客中转载文章中的tftp配置任意一种方法修改配置,就可以解决问题了。
2、tftp配置成功之后,tftp下载仍然不行,提示说收到的包opcode不对
解决办法:
利用wireshark进行调试,打开wireshark监听eth0端口,mini-boot选择4向PC机发送一个tftp读请求包,通过wireshark可以看出,PC机收到了tftp读请求包,并且PC机向开发板发送了第一个数据包,但是却收不到开发板发过来的ACK包,于是在dm9000_receive_packet()中利用printf函数将收到的每一个字节的内容与wireshark中PC机向开发板发送的第一个数据包的包的内容想比对,发现每一个字节的内容都是相同的,说明dm9000收函数没有出错,dm9000收到的数据包将会发送给MAC层,在MAC层会解析收到的是IP包还是ARP包(通过opcode来判断),于是在MAC层eth_recv函数中添加printf函数,若收到ip包则打印收到IP包,若收到ARP包,则打印收到ARP包,结果打印出了收到IP包,这个结果是正确的,因为tftp数据包里面包含的确实应该是IP包,说明MAC层没问题,MAC层收到的IP数据包又会交给IP层处理,在IP层又会根据opcode判断收到的是UDP包还是TCP包,因为tftp是基于UDP的,所以在收到UDP包的分支中加printf函数,如果收到UDP包,则打印收到UDP包,但是却没有打印出来,所以这地方肯定有错了,然后在这个地方继续加printf函数,打印出收到的IP包中的opcode,结果打印出的值是0x11,0x11十进制是17,是UDP包的类型啊,怎么错了呢,说明case PROCO_UDP的值不是0x11,于是查看头文件中PROCO_UDP的值,原因找到了,头文件中PROCO_UDP被我定义为0x17,我倒,把0x17改成十进制的17或者改成0x11就可以进行tftp下载了。
3、没啥反应
最后结果查出把#define DM9000_ADDR (*((volatile unsigned short *)0x20000000))
写成了 #define DM9000_ADDR (*(volatile unsigned short *)0x20000000)
我擦!
阅读(3276) | 评论(1) | 转发(0) |