Chinaunix首页 | 论坛 | 博客
  • 博客访问: 816976
  • 博文数量: 117
  • 博客积分: 2583
  • 博客等级: 少校
  • 技术积分: 1953
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-06 22:58
个人简介

Coder

文章分类
文章存档

2013年(1)

2012年(10)

2011年(12)

2010年(77)

2009年(13)

2008年(4)

分类: 嵌入式

2010-03-11 20:46:36

第五步、添加网络支持

接下来,添加对于网络的支持。这一步任务,是给u-boot移植dm9000的网卡驱动。u-boot自带网卡驱动,所以只要做些设置即可。

先看下关于网络的初始化部分代码,在lib_arm/board.c文件中可以看到:

#if defined(CONFIG_CMD_NET)

#if defined(CONFIG_NET_MULTI)

    puts ("Net:   ");

#endif

    eth_initialize(gd->bd);

#if defined(CONFIG_RESET_PHY_R)

    debug ("Reset Ethernet PHY\n");

    reset_phy();

#endif

#endif

追踪eth_initialize函数,在文件net/eth.c文件中。这个函数会调用board_eth_init函数,而这个函数在文件board/Samsung/mini2440/mini2440.c中。在这个函数中我们可以看到:

#ifdef CONFIG_CS8900

    rc = cs8900_initialize(0, CONFIG_CS8900_BASE);

#endif

而这个实际上初始化网卡的函数在drivers/net/cs8900.c文件里,也就是CS8900网卡的驱动文件里。则我们当然需要改变几行初始化网卡的代码,来调用DM9000的驱动文件里的初始化函数。在drivers/net/目录下的Makefile里,我们可以看到:

COBJS-$(CONFIG_DRIVER_DM9000) += dm9000x.o

DM9000的初始化的函数为

dm9000_initialize
include/configs/mini2440.h中,U-Bootsmdk2410默认情况下是支持CS8900网卡的,所以首先我们先注掉对CS8900的支持(加入dm9000定义,加入ping命令定义):

#if 0
#define CONFIG_NET_MULTI
#define CONFIG_CS8900        /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE    0x19000300
#define CONFIG_CS8900_BUS16    /* the Linux driver does accesses as shorts */
#endif

根据原来的代码,先尝试着定义几个宏:
#define CONFIG_NET_MULTI        1

#define CONFIG_DRIVER_DM9000        1

#define CONFIG_DM9000

修改board/samsung/mini2440.c文件,文件末尾是一个网卡初始化的函数。默认情况下只提供对于CS8900网卡的支持啊。所以我们在return语句前添加:
#ifdef CONFIG_DRIVER_DM9000
    rc = dm9000_initialize(bis);

然后编译,会报错,说几个符号未定义,CONFIG_DM9000_BASEDM9000_IODM9000_DATA这几个符号的意思分别是总线方式访问网卡的基地址、总线方式访问网卡的IO地址和总线方式访问网卡的数据地址。

在这里#define CONFIG_DM9000_BASE 的定义最为重要。不同的板子只要修改这个参数即可。友善之臂的SBC2440V4上的DM9000BANK4上所以定义为“0x20000300”。有 的板子是在BANK1上,就为“0x08000300”于是我们补充定义几个宏:

#define CONFIG_DM9000_BASE        0x20000300
#define DM9000_IO             CONFIG_DM9000_BASE
#define DM9000_DATA        (CONFIG_DM9000_BASE+4)

并且,为了便于测似乎,我们添加对于ping命令的支持,所以添加
#define CONFIG_CMD_PING

同时,修改网络相关参数, 各项根据自己的实际情况设置即可:
#define CONFIG_BOOTDELAY 3
#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
#define CONFIG_ETHADDR 0a:1b:2c:3d:4e:5f
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.6
#define CONFIG_SERVERIP 192.168.1.23

#define CONFIG_BOOTCOMMAND  "nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm"
重新编译后,可以ping通网络了。(也可以在u-boot启动后,修改相关参数,但因为现阶段还没有支持nandflash,参数无法保存,故在此改变较为方便)
又发现,ping是能ping通了,但报could not establish link(不能建立链接)的错。不影响使用。参考网上的资料,发现这是因为在网卡驱动中,drivers/net/dm9000.c,有一段程序试图连接网卡的MII接口,而实际上MII接口并未使用,所以有十秒的等待时间,且报错,将此段程序注释掉即可。

根据网上的一些资料,还有一些与网络有关的宏需要定义:

#define CONFIG_NET_RETRY_COUNT        20
#define CONFIG_DM9000_USE_16BIT        1
#define CONFIG_DM9000_NO_SROM        1
#undef CONFIG_DM9000_DEBUG

如此,我们的U-Boot则以提供了对于网络的支持了。

阅读(1958) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~