helloyesyes 发表于 2013-1-26 13:36:48

ARM+LINUX移植攻略(五)U-boot-2009.08移植TE2440II开发板--支持DM9000A

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处   
http://blog.csdn.net/woshixingaaa/archive/2011/02/11/6179100.aspx   
今天看了Nandflash部分,感觉不是一时半会儿能搞定的,所以先避实就虚呵呵,搞定了网卡。飞凌TE24440II使用的是双网卡,CS8900和DM9000A。已经有很好的网卡驱动代码,我们只要根据自己的板子适当修改一下就行,所以难度比Nandflash低得多。废话少说,看看怎么改。   
首先注释掉跟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 */      
在include/configs/TE2440II.h中添加      
#define CONFIG_DRIVER_DM9000 1      
#define CONFIG_NET_MULTI 1      
#define CONFIG_DM9000_NO_SROM 1      
#define CONFIG_DM9000_BASE 0x20000000 //网卡片选地址      
#define DM9000_IO CONFIG_DM9000_BASE //网卡命令端口      
#define DM9000_DATA (CONFIG_DM9000_BASE+4) //网卡数据端口      
//增加ping命令      
#define CONFIG_CMD_PING
//MAC地址      
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b      
#define CONFIG_NETMASK 255.255.255.0      
//开发板的IP地址      
#define CONFIG_IPADDR 192.168.1.105      
//Linux主机的IP地址      
#define CONFIG_SERVERIP 192.168.1.103      
注释掉以前跟这个重复的。      
添加网卡初始化代码: 修改board/samsung/TE2440II/TE2440II.c      
#include <net.h>      
#include <netdev.h>      
#ifdef CONFIG_DRIVER_DM9000      
int board_eth_init(bd_t *bis)      
{      
return dm9000_initialize(bis);      
}      
#endif      
在drivers/net/dm9000x.c中修改(屏蔽掉dm9000_init中的这一部分,不然使用网卡的时候会报“could not establish link”的错误)      
#if 0      
i = 0;      
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */      
udelay(1000);      
i++;      
if (i == 10000) {      
printf("could not establish link\n");      
return 0;      
}      
}      
#endif      
修改drivers/net/dm9000x.c。屏蔽掉dm9000_halt函数中的内容,否则ping不通。      
/*      
Stop the interface.      
The interface is stopped when it is brought.      
*/      
static void dm9000_halt(struct eth_device *netdev)      
{      
//DM9000_DBG("%sn", __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 */      
}      
重新编译烧录到Norflash就可以了。      
这里需要注意的是#define CONFIG_DM9000_BASE 0x20000000 //网卡片选地址。而不是0x20003000,这个是DM9000,而我们使用的是DM9000A。因为CMD接在ADDR2上所以#define DM9000_DATA (CONFIG_DM9000_BASE+4)。因为DM9000A的地址信号和数据信号复用,CMD引脚决定传输的是地址信号还是数据信号。数据手册上说CMD为0时是地址信号所以DM9000_IO CONFIG_DM9000_BASE,CMD为1时,是数据信号,所以#define DM9000_DATA (CONFIG_DM9000_BASE+4)。DM9000A内部有一个4K Dword SRAM,因为数据线和地址线是复用的,所以如果这部分用地址线进行寻址,范围是16KB,所以在 0x20000000~0x20000000+16KB范围内都可以的。所以0x20003000是碰巧在这里的。第一次ping不同,第二次开始就可以ping通了,这个是正常现象。
http://hi.csdn.net/attachment/201102/11/0_12974116872Do8.gif
页: [1]
查看完整版本: ARM+LINUX移植攻略(五)U-boot-2009.08移植TE2440II开发板--支持DM9000A