2009.08移植TE2440II开发板(5)

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

6

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwfwfz.html