u-boot网卡驱动移植

u-boot网卡驱动移植

网卡移植的驱动是针对国嵌GQ2440开发板的,u-boot版本为u-boot-2009,比这版本高一些的也没问题。移植主要有一下几个步骤,大多数和mini2440相同。

1.设置网卡的位宽

由于s3c2440存储控制器的bank4连接的是DM9000网卡,下面是网上截取的图,可知网卡位宽为16。

u-boot网卡驱动移植_第1张图片
接着在lowlevel_init.S修改如下代码

    #define B1_BWSCON               (DW16)
    #define B2_BWSCON               (DW16)
    #define B3_BWSCON               (DW16)
    #define B4_BWSCON               (DW16)//没有使用wait信号
    #define B5_BWSCON               (DW8)
    #define B6_BWSCON               (DW32)
    #define B7_BWSCON               (DW32)

2.设置网卡时序
相关位的含义如下图:
u-boot网卡驱动移植_第2张图片
修改的代码如下:

#define B4_Tacs                 0x0
#define B4_Tcos                 0x0
#define B4_Tacc                 0x7
#define B4_Tcoh                 0x1//这句修改,其它的和mini2440相似
#define B4_Tah                  0x0
#define B4_Tacp                 0x0
#define B4_PMC                  0x0

3、在board/GQ2440/GQ2440.c 文件中添加网卡驱动入口函数

添加如下代码:

#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
        int rc = 0;
#ifdef CONFIG_CS8900
        rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DRIVER_DM9000
        rc = dm9000_initialize(bis);
#endif
        return rc;
}
#endif

4、在include/configs/GQ2440.h文件添加网卡驱动相关定义
主要是DM9000的基地址设置

#define CONFIG_NET_MULTI                1
#define CONFIG_NET_RETRY_COUNT          20
#define CONFIG_DRIVER_DM9000            1
#define CONFIG_DM9000_BASE              0x20000000  
#define DM9000_IO                       CONFIG_DM9000_BASE
#define DM9000_DATA                     (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT         1
#define CONFIG_DM9000_NO_SROM           1
#undef CONFIG_DM9000_DEBUG

5、修改网卡驱动相关代码

在drivers/net/dm9000x.c文件中主要进行如下的修改
防止出现“could not establish link”的错误,进行下面修改:

i = 0;
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
    udelay(1000);
    i++;
    if (i == 1000) {
//        printf("could not establish link\n");
//        return 0;
          break;
     }
}

防止出现ping不同的情况,修改如下代码:

static void dm9000_halt(struct eth_device *netdev)
{
#if 0
        DM9000_DBG("%s\n", __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 */
#endif
}

到此为止,网卡驱动移植完成了。

你可能感兴趣的:(uboot)