今天看了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通了,这个是正常现象。


