s3c2440+lan91c111 vxworks驱动调试
最近调试一个s3c2440+lan91c111网卡的vxworks驱动程序,调试了快一个月了,还差一点,把主要过程写出来,和大家交流。
1)以前的板子是s3c2440+dm9000的结构,因为温度原因,需要改为lan91c111,因为这个芯片是工业级的,温度范围合适;
2)在借鉴网络上s3c2410的vxworks BSP上,我们自主调试了s3c2440的vxworks BSP,包括dm9000网卡;调试花了两个月时间,也破费周折,主要在开起MMU之后的中断重新映射,dm9000双缓冲区等问题上。有空,把s3c2440的vxworks移植笔记传上。网络系统的效能和MMU有很大关系,开启后,使用UDP测试,DM9000网卡的实际可用速率有50Mbps,tcp大约18Mbps;而不开启MMU,udp速率只有10M左右;
3)4月份,移植lan91c111驱动。cpu和网卡使用的32位数据读写,程序是从smc公司下载的基于PC构架的原始代码。首先需要修改的是底层的读写函数,以及cpu的内存读写寄存器的配置;
4)移植驱动,首先是需要能够读出寄存器,以及芯片ID号,这个过程调试了2周,一直都读不出来。以为是硬件的原因,芯片重新焊接,电路反复检查了很久,终于发现CPU的读写时序配置,片选线需要比地址线早发出两个时钟周期,也就是tcos;默认是0;以前在调试dm9000的时候,使用默认配置一直是没有问题的;
5)解决了硬件读写的问题后,把修改后的程序移植到vxworks,启动网卡,发现网卡的灯不亮,进一步调试发现不能检测到PHY设备,这又是lan91c111比dm9000复杂的地方,需要对PHY进行配置;修改了PHY读写的程序,终于能够把灯点亮了;
6)下面是调试中断,lan91c111是高电平中断,不是边沿触发,这个问题又调试了两天;
7)中断调试通过后,收发数据包在驱动中都能打印出相应的信息;但是没有办法ping通;
8)通过打印信息,发现网卡在驱动中已经接收到了ping的数据包,而且与sniffer抓到的包是一样的;使用ifShow命令可以看到接收到的数据包的数目,说明网卡接收到的数据已经传递到ip层了,但是使用icmpstatShow命令,看不到数据包,说明在ip传给icmp的中间包丢弃了;
9)编写了专门的发送程序,当使用udp发送往计算机上发数据的时候,计算机能够接收到数据,吞吐量大约为35Mbps
10)计算机能够收到数据,说明发送是没有问题的,如果计算机发送udp数据,arm同样收不到数据;
11)发现当计算机发出arp包请求的时候,arm能够收到arp的解析包,并且回应arp包,而计算机发出ping包的时候,arm包没有回应ping包,这说明是解析IP包的时候出现问题的;
12)当arm板发出ping包的时候,sniffer抓包表明,arm的echo包发出了,而pc机的echo reply也发出了,并且驱动接收程序中打印出的echo reply数据也是正确的;
13)怀疑是接收程序在往IP传数据的时候是不是存在32为对齐,crc校验等问题,检查后好像没有发现问题;
14)使用ifShow都能够检测到接收的的数据包,但为什么不能接收的有效的数据呢?这个问题已经调试了很久了,不知道各位有没有什么好的建议。谢谢!
15)本人这里有很多的嵌入式的代码和经验,欢迎交流。