移植u-boot-2011.09-rc1到FL2440(3)

    最近工作有点忙,所以到现在才开始做,今天实现了UBOOT中关于DM9000的部分,当然都是拿来主意,对于网卡我是相当陌生的。

    首先,在include/configs/fl2440.h中去掉原先CS8900网卡的定义,再定义各种关于DM9000网卡的宏:

   

/*#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 */
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4) /* the cmd pin is addr2*/
#define CONFIG_ETHADDR a8:00:3E:26:0A:5B
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.11
#define CONFIG_SERVERIP 192.168.1.234
#define CONFIG_NET_MULTI

/*
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR           10.0.0.110
#define CONFIG_SERVERIP         10.0.0.1
*/
   DM9000在FL2440的硬件连接原理图:

    图中可以看出DM9000连接到NGCS4,看下地址空间可以知道NGCS4的基址是0x20000000,所以网卡基址是0x20000300,后面这个300据他们说是DM9000内部寄存器是这样定义的,就现实来说我的网卡在这个基址上工作良好,所以应该是对的。

    CMD连接的是ADDR2,查DM9000手册上CMD为1时发送的是数据信息,所以,DM9000的数据地址是0x20000304,这个很容易理解。

    修改fl2440.c中的board_eth_init函数:

#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
        return dm9000_initialize(bis);
}
#endif
    修改drivers/net/dm9000x.c,将下面这段注释掉,至于原因,我也不清楚,不管。
        i = 0;
        while (!(dm9000_phy_read(1) & 0x20)) {  /* autonegation complete bit */
                udelay(1000);
                i++;
                if (i == 10000) {
                        printf("could not establish link\n");
                        return 0;
                }
        }

        /* see what we've got */
        lnk = dm9000_phy_read(17) >> 12;
        printf("operating at ");
        switch (lnk) {
        case 1:
                printf("10M half duplex ");
                break;
        case 2:
                printf("10M full duplex ");
                break;
        case 4:
                printf("100M half duplex ");
                break;
        case 8:
                printf("100M full duplex ");
                break;
        default:
                printf("unknown: %d ", lnk);
                break;
        }
        printf("mode\n");
    注释这个函数中的内容,不然网卡会自动断开:

static void dm9000_halt(struct eth_device *netdev)
{
#if 0
        DM9000_DBG("%s\n", __func__);

        /* RESET devie */
        dm9000_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
}
    编译好后,网卡就起来了。



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/crazyman2010/article/details/6882361
个人分类: u-boot
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭