[转]u-boot-2010.12移植到2440(三,DM9000网卡驱动移植)
转自
http://my.chinaunix.net/space.php?uid=24319701&do=blog&id=132091
在这一篇中,我们让开发板实现对DM9000X网卡的支持,后续的移植及调试均依赖网络的支持。
u- boot的新版本已经对CS8900和DM9000X网卡有比较完善的代码支持(代码在drivers/net/目录下),而且在 S3C24XX系列中默认对CS8900网卡进行配置使用。只是在个别地方要根据开发板的具体网卡片选进行设置,就可以对S3C24XX系列中 CS8900网卡的支持使用。
由于我们的目标板采用的是dm9000网卡,我们通过drivers/net/目录下有关DM9000的代码,发现dm9000x.h中对CONFIG_DRIVER_DM9000宏的依 赖,dm9000x.c中对CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依赖,所以我们修改代码如下:
#define CONFIG_NET_MULTI 1
/* * Hardware drivers */ 屏蔽掉u-boot默认对CS8900网卡的支持
//#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
//#define CS8900_BASE 0x19000300
//#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */
//添加u-boot对DM9000X网卡的支持
#define CONFIG_CMD_NET
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_NO_SROM 1
#define CONFIG_DM9000_BASE 0x18400300//网卡片选地址,需要根据具体目标板修改
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4) //网卡数据地址
//给u-boot加上ping命令,用来测试网络通不通
#define CONFIG_CMD_PING
//恢复被注释掉的网卡MAC地址和修改你合适的开发板IP地址
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b //开发板MAC地址
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.0.110 //开发板IP地址
#define CONFIG_SERVERIP 192.168.0.7 //Linux主机IP地址
board/samsung/smdk2440/smdk2440.c 添加板载DM9000网卡初始化代码,如下:
#include <net.h>
#include <netdev.h>
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis);
#endif
return rc;
}
#endif
编译之后加载到内存运行,可以ping通,但是串口出现大量“raise:signal # 8 caught”.找到打印该语句的地方, arch/arm/lib/eabi_compat.c,
int raise (int signum)
{
/*printf("raise: Signal # %d caught/n", signum);*/
return 0;
}
直接删除掉该打印(比较简单粗暴,但是验证证实确实可以的,目前未发现什么问题。)
然后下载运行ping命令,发现不通,出现“could not establish link”的错误,参考网友的处理方法:修改drivers/net/dm9000x.c
#if 0 //屏蔽掉dm9000_init函数中的这一部分,不然使用网卡的时候会报“could not establish link”的错误
i = 0;
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish link ");
return 0;
}
}
#endif
/*
Stop the interface.
The interface is stopped when it is brought.
*///屏蔽掉dm9000_halt函数中的内容
static void dm9000_halt(struct eth_device *netdev)
{
#if 0
DM9000_DBG("%s/n", __func__);
/* RESET devie */
phy_write(0, 0x8000); /* PHY RESET */
DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */
DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */
DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */
#endif
}
然后再次完全重新编译,测试ping和tftp命令,均正常,至此dm9000的驱动移植完成可以正常工作。至于“raise:signal # 8 caught”的错误,后续可以再仔细研究,目前怀疑是新版本的BUG。