Coder
分类: 嵌入式
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-Boot的smdk2410默认情况下是支持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_BASE、DM9000_IO、DM9000_DATA,这几个符号的意思分别是总线方式访问网卡的基地址、总线方式访问网卡的IO地址和总线方式访问网卡的数据地址。
在这里#define CONFIG_DM9000_BASE 的定义最为重要。不同的板子只要修改这个参数即可。友善之臂的SBC2440V4上的DM9000在BANK4上所以定义为“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
#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则以提供了对于网络的支持了。