DM9000调试记录
最近在调试DM9000,遇到了很多问题,在网上几乎也能找到同样的问题,但是答案千变万化,弄的我这样不行,那样也不行。
1、遇到的第一个问题,网卡不识别,出现的调试信息就是:
dm9000 dm9000.0: DM9000E read wrong id 0x00000040
dm9000 dm9000.0: DM9000E read wrong id 0x00000040
dm9000 dm9000.0: DM9000E read wrong id 0x00000046
dm9000 not found
其中id经常发生变化,常见的有0x00000000或者 0x2b2a2928
这个问题主要在四个方面去查:CMD信号,看看CMD信号是否连接到ADDR2(最好不要给Addr1上连接,驱动修改起来比较困难)
Int信号,看看Int信号是否连接到EINT的管脚,这个可以随便选择,选择完后,需要在驱动里面进行修改,修改之处在:
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7, //外部中断改这个地方
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
}
从上面可以看到,INT管脚使用的是EINT7,其余地方不用修改
RST信号:在不确定RST信号连接的管脚时,最好直接接到地,这样比较保险
cs信号:CS的信号可选4个,这个是情况而定,如果选择了NGCS3,那么在网卡驱动中要做对应的修改,修改之处在:
static struct resource s3c_dm9k_resource[] =
{
[0] =
{
.start = S3C2410_CS3, //网卡连接在CS3总线上 ,总线改这个地方
.end = S3C2410_CS3 + 3,
.flags = IORESOURCE_MEM,
},
[1] =
{
.start = S3C2410_CS3 + 4, //S3C2410_CS3 + 2,
.end = S3C2410_CS3 + 4 + 3, //S3C2410_CS3 + 2 + 3, //addr改这个地方
.flags = IORESOURCE_MEM,
},
这样,如果芯片焊接的没问题,那么DM9000在系统启动的时候就可以发现了,启动后出现如下的信息,表明DM9000已经发现了:
dm9000 Ethernet Driver, V1.31
*****dm9000.c line 1248 db->addr_res=-1068488320
****dm9000.c line 1285 i=0
***dm9000.c line 1270 db->io_addr=-998113280
***dm9000.c line 1289 db->io_data=-998096892
eth0 (dm9000): not using net_device_ops yet
eth0: dm9000e at c4820000,c4824004 IRQ 52 MAC: 00:4a:00:00:00:00 (chip)
这样第一个问题就可以解决了,但是有时候DM9000发现了,但是不能通信,就是Ping不通,当插上网线后出现如下的信息:
eth0: eth0: link up, 100Mbps, full-duplex, no lpa
这个问题调试了好长时间,一直以为是驱动问题,网上有人说是6.8K电阻的精度不够或者PCB的走线有问题等(搞的差点重新绘制电路板了)
经过检查原来是有个信号在作怪,我在DM9000上挂了一个AT93C46的存储器,是用来存储MAC地址的,其实很简单就是SPI接口,但是就是应为疏忽了这点导致花费了很多功夫。
开始我没有在EECS信号上加上拉电阻,当系统在运行udhcpc (v1.15.1) started 的时候,就会弹出一大堆的信息,没有抓下来图,大概就是Time out之类的信息,然后下次插上网卡后可以识别,但是弹出eth0: eth0: link up, 100Mbps, full-duplex, no lpa 。
解决的办法就是:首先将AT93C46给去掉了,然后就已经可以通信成功,但是MAC地址不能存储。在EECS信号线上加了4.7K的上拉电阻,焊接上AT93C46就可以通信了,Ping某个IP地址就可成功。
PING 172.20.223.40 (172.20.223.40): 56 data bytes
64 bytes from 172.20.223.40: seq=0 ttl=64 time=2.932 ms
64 bytes from 172.20.223.40: seq=1 ttl=64 time=1.027 ms
64 bytes from 172.20.223.40: seq=2 ttl=64 time=0.894 ms
64 bytes from 172.20.223.40: seq=3 ttl=64 time=0.846 ms
64 bytes from 172.20.223.40: seq=4 ttl=64 time=0.876 ms
64 bytes from 172.20.223.40: seq=5 ttl=64 time=0.896 ms
64 bytes from 172.20.223.40: seq=6 ttl=64 time=0.905 ms
64 bytes from 172.20.223.40: seq=7 ttl=64 time=0.890 ms
64 bytes from 172.20.223.40: seq=8 ttl=64 time=1.454 ms
64 bytes from 172.20.223.40: seq=9 ttl=64 time=0.879 ms
64 bytes from 172.20.223.40: seq=10 ttl=64 time=0.863 ms
64 bytes from 172.20.223.40: seq=11 ttl=64 time=0.808 m