免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1942 | 回复: 0

移植u-boot到FL2440开发板(六)——支持DM9000a [复制链接]

论坛徽章:
0
发表于 2011-12-20 09:44 |显示全部楼层

    在这一篇中,我们首先让开发板对CS8900或者DM9000X网卡的支持,然后再分析实现u-boot怎样来引导Linux内核启动。因为测试u-boot引导内核我们要用到网络下载功能。

7)u-boot对CS8900或者DM9000X网卡的支持。
    u-boot-2009.08版本已经对CS8900和DM9000X网卡有比较完善的代码支持(代码在drivers/net/目录下),而且在S3C24XX系列中默认对CS8900网卡进行配置使用。只是在个别地方要根据开发板的具体网卡片选进行设置,就可以对S3C24XX系列中CS8900网卡的支持使用。代码如下:

  1. #vim include/configs/yyq2440.h

  2. /*
  3.  * Hardware drivers
  4.  */
  5. #define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
  6. #define CS8900_BASE 0x19000300 //注意:对不同的开发板就是要修改这个片选地址参数,这个参数值就看开发板上网卡的片选引脚是接到ARM芯片存储控制器的哪个Bank上

  7. #define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */

现在修改对我们开发板上DM9000X网卡的支持。
    首先,我们看看drivers/net/目录下有关DM9000的代码,发现dm9000x.h中对CONFIG_DRIVER_DM9000宏的依赖,dm9000x.c中对CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依赖,所以我们修改代码如下:

  1. #vim include/configs/yyq2440.h

  2. /* * Hardware drivers */ 屏蔽掉u-boot默认对CS8900网卡的支持
  3. //#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
  4. //#define CS8900_BASE 0x19000300
  5. //#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */

  6. //添加u-boot对DM9000X网卡的支持
  7. #define CONFIG_DRIVER_DM9000 1
  8. #define CONFIG_NET_MULTI 1
  9. #define CONFIG_DM9000_NO_SROM 1
  10. #define CONFIG_DM9000_BASE 0x20000000 //网卡片选地址

  11. #define DM9000_IO CONFIG_DM9000_BASE
  12. #define DM9000_DATA (CONFIG_DM9000_BASE + 4) //网卡数据地址
  13. #define CONFIG_DM9000_USE 16BIT 1

  14. 注意:
  15. u-boot-2009.08 可以自动检测DM9000网卡的位数,根据开发板原理图可知网卡的数据位为16位,并且网卡位于CPU的BANK4上

  16. //给u-boot加上ping命令,用来测试网络通不通
  17. #define CONFIG_CMD_PING

  18. //恢复被注释掉的网卡MAC地址和修改你合适的开发板IP地址
  19. #define CONFIG_ETHADDR 08:00:3e:26:0a:5b //开发板MAC地址
  20. #define CONFIG_NETMASK 255.255.255.0
  21. #define CONFIG_IPADDR 192.168.7.1 //开发板IP地址
  22. #define CONFIG_SERVERIP 192.168.1.11

添加板载DM9000网卡初始化代码,如下:

  1. #vim board/samsung/yyq2440/yyq2440.c

  2. #include <net.h>
  3. #include <netdev.h>

  4. #ifdef CONFIG_DRIVER_DM9000
  5. int board_eth_init(bd_t *bis)
  6. {
  7.     return dm9000_initialize(bis);
  8. }
  9. #endif

修改MD9000网卡驱动代码,如下:

  1. #vim drivers/net/dm9000x.c

  2. static int dm9000_init(struct eth_device *dev, bd_t *bd)
  3. {
  4.     ............
  5.     
  6.     i = 0;
  7.     while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
  8.         udelay(1000);
  9.         i++;
  10.         if (i == 10000) {
  11.             //printf("could not establish link ");
  12.             //return 0;
  13.             //把上面改为break;不然使用网卡的时候会报“could not establish link”的错误
  14.             break;    
  15.         }
  16.     }

  17.     .............
  18.  }

然后重新编译u-boot,下载到Nand中从Nand启动,查看启动信息和环境变量可以得知,u-boot已经可以识别了dm9000。

  1. U-Boot 2009.08 ( 2月 28 2011 - 20:48:30)

  2. DRAM: 64 MB
  3. Flash: 512 kB
  4. NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!

  5. 128 MiB
  6. In: serial
  7. Out: serial
  8. Err: serial
  9. Net: dm9000
  10. [yyq2440] #

并使用ping命令测试网卡,操作如下:

  1. [yyq2440] # printenv
  2. bootdelay=3
  3. baudrate=115200
  4. ethaddr=08:00:3e:26:0a:5b
  5. ipaddr=192.168.7.1
  6. serverip=192.168.7.11
  7. netmask=255.255.255.0
  8. stdin=serial
  9. stdout=serial
  10. stderr=serial
  11. ethact=dm9000
  12.                                                                                 
  13. Environment size: 175/131068 bytes
  14. [yyq2440] # ping 192.168.7.11
  15. dm9000 i/o: 0x20000000, id: 0x90000a46
  16. DM9000: running in 16 bit mode
  17. MAC: 08:00:3e:26:0a:5b
  18. operating at 100M full duplex mode
  19. Using dm9000 device
  20. ping failed; host 192.168.7.11 is not alive
  21. [yyq2440] #
可以看到,启动信息里面显示了Net:dm9000,printenv查看的环境变量也和include/configs/yyq2440.h中设置的一致。但是现在有个问题就是ping不能通过。
 
经过一段时间在网上搜索,原来有很多人都碰到了这种情况。出现问题的地方可能是DM9000网卡驱动中关闭网卡的地方,如是就试着修改代码如下:
  1. #gedit drivers/net/dm9000x.c //屏蔽掉dm9000_halt函数中的内容

  2. /*
  3.   Stop the interface.
  4.   The interface is stopped when it is brought.
  5. */
  6. static void dm9000_halt(struct eth_device *netdev)
  7. {
  8.     //DM9000_DBG("%sn", __func__);

  9.     ///* RESET devie */
  10.     //phy_write(0, 0x8000); /* PHY RESET */
  11.     //DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */
  12.     //DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */
  13.     //DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */

  14. }
结果,只是第一次ping不通,以后都是可以ping通的(据网友们说这是正常的),如下图:
  1. U-Boot 2009.08 ( 2月 28 2011 - 20:57:16)

  2. DRAM: 64 MB
  3. Flash: 512 kB
  4. NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!

  5. 128 MiB
  6. In: serial
  7. Out: serial
  8. Err: serial
  9. Net: dm9000
  10. [yyq2440] #
  11. [yyq2440] # ping 192.168.7.11
  12. dm9000 i/o: 0x20000000, id: 0x90000a46
  13. DM9000: running in 16 bit mode
  14. MAC: 08:00:3e:26:0a:5b
  15. operating at 100M full duplex mode
  16. Using dm9000 device
  17. ping failed; host 192.168.7.11 is not alive
  18. [yyq2440] # ping 192.168.7.11
  19. dm9000 i/o: 0x20000000, id: 0x90000a46
  20. DM9000: running in 16 bit mode
  21. MAC: 08:00:3e:26:0a:5b
  22. operating at 100M full duplex mode
  23. Using dm9000 device
  24. ping failed; host 192.168.7.11 is alive

    好了,现在只剩下一个问题了,就是使用tftp进行下载。关于tftp服务器在Linux中的安装和配置,这里我就不讲了,在网上搜一下很多的。然而,在tftp下载时又遇到了问题。我先试着下载一个小文件hello.bin,没有问题。但是尝试下载2M大小的zImage的时候i,总是出现传送不完整又重新传送的现象,不断的循环,如下图:

  1. [yyq2440] # tftp 0x30008000 hello.bin
  2. dm9000 i/o: 0x20000300, id: 0x90000a46
  3. DM9000: running in 16 bit mode
  4. MAC: 08:00:3e:26:0a:5b
  5. operating at unknown: 0 mode
  6. Using dm9000 device
  7. TFTP from server 192.168.1.101; our IP address is 192.168.1.100
  8. Filename 'hello.bin'.
  9. Load address: 0x30008000
  10. Loading: #
  11. done
  12. Bytes transferred = 514 (202 hex)

  13. [yyq2440] # tftp 0x30800000 zImage
  14. dm9000 i/o: 0x20000300, id: 0x90000a46
  15. DM9000: running in 16 bit mode
  16. MAC: 08:00:3e:26:0a:5b
  17. operating at unknown: 0 mode
  18. Using dm9000 device
  19. TFTP from server 192.168.1.101; our IP address is 192.168.1.100
  20. Filename 'zImage'.
  21. Load address: 0x30800000
  22. Loading: T T T ###T T T T T T T
  23. Retry count exceeded; starting again
  24. dm9000 i/o: 0x20000300, id: 0x90000a46
  25. DM9000: running in 16 bit mode
  26. MAC: 08:00:3e:26:0a:5b
  27. operating at unknown: 0 mode
  28. Using dm9000 device
  29. TFTP from server 192.168.1.101; our IP address is 192.168.1.100
  30. Filename 'zImage'.
  31. Loading: T ##T T T T T T T T T
  32. Retry count exceeded; starting again
  33. ^C
  34. Abort
  35. [yyq2440 ] #

    经过一段时间的努力,困惑好久的tftp问题现在终于搞定啦,心情真是爽啊!!首先分析上面图中的现象,在下载过程中断断续续就说明是可以下载的,只是由于某种原因使网络出现超时从而重新下载,那我想出现这种情况的最大的可能性就是u-boot中对网络的延时设置;我就跟踪u-boot中的代码,结果发现真的是这个原因。解决办法就是修改tftp网络源码中关于超时的值。

  1. #vim net/tftp.c

  2. #define TIMEOUT    5000UL
  3. #ifndef CONFIG_NET_RETRY_COUNT
  4. # define TIMEOUNT_COUNT    10
  5. #else
  6. # define TIMEOUNT_COUNT(CONFIG_NET_RETRY_COUNT * 2)
  7. #endif

因为没有定义CONFIG_NET_RETRY_COUNT这个宏,所以改为:

  1. #vim net/tftp.c

  2. #define TIMEOUT    13000UL
  3. #ifndef CONFIG_NET_RETRY_COUNT
  4. # define TIMEOUNT_COUNT    25
  5. #else
  6. # define TIMEOUNT_COUNT(CONFIG_NET_RETRY_COUNT * 2)
  7. #endif

最后重新编译烧写到开发板,并用tftp下载zImage,虽然还是有超时的时候,不过最后还是能够下载完整个文件。花了好几天时间终于把问题解决完了。大功告成!!心里有些许激动。嘿嘿。

    1. U-Boot 2009.08 ( 2月 28 2011 - 21:27:46)

    2. DRAM: 64 MB
    3. Flash: 512 kB
    4. NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!

    5. 128 MiB
    6. In: serial
    7. Out: serial
    8. Err: serial
    9. Net: dm9000
    10. [yyq2440] # tftp 0x30008000 zImage
    11. dm9000 i/o: 0x20000300, id: 0x90000a46
    12. DM9000: running in 16 bit mode
    13. MAC: 08:00:3e:26:0a:5b
    14. operating at 100M full duplex mode
    15. Using dm9000 device
    16. TFTP from server 192.168.7.11; our IP address is 192.168.7.1
    17. Filename 'zImage'.
    18. Load address: 0x30008000
    19. Loading: T T T T T #########################T #T ###################
    20. ###T T ####T #################T ######################T ### ###T T
    21. ######
    22. done
    23. Bytes transferred = 2026844 (1eed5c hex)
    24. [yyq2440] #

     

    2011-02-28

     

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP