移植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
}
    编译好后,网卡就起来了。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值