dm9000ae 在u-boot上的移植小结(转)

来源:互联网 发布:js遍历数组赋值 编辑:程序博客网 时间:2024/05/22 06:19
dm9000ae 在u-boot上的移植小结
2007-12-16


 

        好久没更新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的内容,一切搞定^_^。

  • 我现在发现用2440A发送数据的时候没有问题,但是接收到ping的数据打印却都是0,再次ping就啥都接收不到。一下是我的一些打印记录:
    请帮我分析分析,这是不是我的DM900AE与CPU有一个缓冲有关,以至于无法正常接受数据?
    /*************************************
    17:35 2008-3-20
    *************************************/
    [ lxi2440a ]# ping 192.168.0.63

    eth_halt

    phy_write(reg:0, value:32768)

    eth_init()

    resetting

    dm9000 i/o: 0x28000300, id: 0x90000a46

    phy_read(3): 32768

    MAC: 08:00:3e:26:0a:5b

    08:00:3e:26:0a:5b:

    phy_read(17): 32768

    operating at 100M full duplex mode

    ping start going

    sending ARP for 3f00a8c0

    ARP broadcast 1

    eth_send: length: 42


    Send: 02x: ff ff ff ff ff ff 08 00

    Send: 02x: 3e 26 0a 5b 08 06 00 01

    Send: 02x: 08 00 06 04 00 01 08 00

    Send: 02x: 3e 26 0a 5b c0 a8 00 de

    Send: 02x: 00 00 00 00 00 00 c0 a8

    Send: 02x: 00 3f

    transmit done


    ARP broadcast 2

    eth_send: length: 42


    Send: 02x: ff ff ff ff ff ff 08 00

    Send: 02x: 3e 26 0a 5b 08 06 00 01

    Send: 02x: 08 00 06 04 00 01 08 00

    Send: 02x: 3e 26 0a 5b c0 a8 00 de

    Send: 02x: 00 00 00 00 00 00 c0 a8

    Send: 02x: 00 3f

    transmit done


    receiving packet

    rx status: 0x4001 rx len: 96

    passing packet to upper layer

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 //我打印ping时收到的数据,有问题。

    packet received

    packet received

    Receive from protocol 0x0

    rx status check: 255

    receiving packet

    rx status: 0xffff rx len: 65535 //明显len溢出了。



    U-Boot 1.2.0 (Mar 20 2008 - 20:26:34)


    U-Boot code: 33F80000 -> 33F9CDA0 BSS: -> 33FA2BE0

    DRAM: 64 MB

    Flash: 1 MB

    NAND: NAND flash probing at 0x4E000000

    64 MB

    In: serial

    Out: serial

    Err: serial

    Hit any key to stop autoboot: 0

    [ lxi2440a ]# ping 192.168.0.63
     

     回复 liu.xuegang 说:
    你试试在dm9000接收的时候加入:
    ior(db,0xf4);
    ior(db,0xf5);
    (2008-03-31 09:54:18)

     

    liu.xuegang () 发表于 2008-03-20 18:23:52
  • 楼主你好!以下是我在移植uboot1.2.0后ping网络时出现的问题,我不知道DM9000和DM9000AEP到底有何不同,能不能具体指点一下!
    [ lxi2440a ]# ping 192.168.0.63

    dm9000 i/o: 0x28000300, id: 0x90000a46

    MAC: 08:00:3e:26:0a:5b

    operating at 100M full duplex mode

    ping failed; host 192.168.0.63 is not alive

    [ lxi2440a ]# printenv

    bootargs=console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.1:/friendly-arm/rootfs_netserv ip=192.168.0.222:192.168.0.1:192.168.0.1:255.255.255.0:debian:eth0:off

    bootcmd=dhcp; bootm

    bootdelay=3

    baudrate=115200

    ethaddr=08:00:3e:26:0a:5b

    ipaddr=192.168.0.222

    serverip=192.168.0.1

    netmask=255.255.255.0

    stdin=serial

    stdout=serial

    stderr=serial


    Environment size: 338/65532 bytes

    [ lxi2440a ]# <INTERRUPT>


    14:41 2008-3-18
    使用wireshark工具检测网络。发现开发板ping主机时,主机可以收到开发板的请求,但主机发回去的结果开发板识别不出来,这个是什么原因呢?
    我猜想,是不是ping的时候调用了网络芯片DM9000的驱动,但是发回来的时候网络芯片没法给2440A中断,让CPU处理ping回的结果?因为在启动后不ping网络时,主机现实网络没有连接好,也就是说主机没法认出有网络连接。

    主机接收的ping请求信息:
    36407 2178.263969 192.168.0.222 192.168.0.63 ICMP Echo (ping) request
    Internet Protocol, Src: 192.168.0.222 (192.168.0.222), Dst: 192.168.0.63 (192.168.0.63)
    Version: 4
    Header length: 20 bytes

    主机返回的ping请求信息(但开发板可能没有收到):
    36408 2178.263997 192.168.0.63 192.168.0.222 ICMP Echo (ping) reply
    Internet Protocol, Src: 192.168.0.63 (192.168.0.63), Dst: 192.168.0.222 (192.168.0.222)
    Version: 4
    Header length: 20 bytes

    此外,我打开了头文件中定义的中断:#define CONFIG_USE_IRQ 1,也没有用,还是提示主机不存在,ping不通,不知怎么办。
     

     回复 liu.xuegang 说:
    你试试在dm9000接收的时候加入:
    ior(db,0xf4);
    ior(db,0xf5);
    是dm9000接收包时出问题。
    (2008-03-31 10:02:50)
原创粉丝点击